source the R script, make.R to generate the project document.

> source("make.R")

This document was generated on 2015-12-18 10:24:20.

1 Project repository

Live version is stored here. Static version is this document.

This document is for the Cognitive Impairment topic.

For other topics, see links from the project repository.

2 Scripts

Sequence of scripts:

prologue.Rmd %>% tidyData.Rmd %>% runMetaAnalysis.Rmd %>% epilogue.Rmd

3 Prologue

  1. Set path of input data sources
  2. Load devtools
  3. Source the loadPkg function
  4. Load packages
  5. Source the makeMetadata function
  6. Start the job timer
## Sourcing https://gist.githubusercontent.com/benjamin-chan/3b59313e8347fffea425/raw/84a146f3cde6330b901521710d513fa9d0b96951/loadPkg.R
## SHA-1 hash of file is 7bdcd4569a86aa9fff8ced241327992c550a16ce
## Sourcing https://gist.githubusercontent.com/benjamin-chan/091209ab4eee1f171540/raw/5043f40fb0c15036b0ce53079045d7d1beae5609/makeMetadata.R
## SHA-1 hash of file is 66a9fa7f31fa5e4e4448ed18f18db768a1c5a70f

4 Tidy data

Sequence of scripts:

replicateOno.Rmd %>% readAhles.Rmd %>% readTager.Rmd %>% reshapeOno.Rmd %>% addFromDataAbstraction.Rmd %>% combineData.Rmd

4.1 Replicate Ono

Replicate data from Ono, Miyuki, et al. “A Meta-Analysis of Cognitive Impairment and Decline Associated with Adjuvant Chemotherapy in Women with Breast Cancer.” Front Oncol. 2015; 5: 59.

Data file was requested and received from the co-author, James Ogilvie, in October 2015.

The DOMAINFORMETAkvd field (column AG) was coded by Kathleen Van Dyk KVanDyk@mednet.ucla.edu.

From: Van Dyk, Kathleen [KVanDyk@mednet.ucla.edu]
Sent: Tuesday, November 03, 2015 5:08 PM
To: Ayse Tezcan
Cc: Benjamin Chan
Subject: RE: Cognitive impairment draft paper

Hi,
 
Attached is the Ono spreadsheet with a new column with my suggestions for
domains and domains for each Ahles test is in sheet 2.  I've highlighted tests
that we may want to exclude if we want to consistently keep one or two
measures per test.  Ben --- does it matter statistically if there is more than
one measure from the same test (for example delayed recall and delayed
recognition) in the same domain?  In almost every case we have total and delay
for memory tests but if we add in more measures (Trial 6, Supraspan,
Recognition) does this confound analyses because these are likely highly
correlated measures within the same test?  Would all of the studies need to
use the same measures in each test (i.e., every study uses Total and Delay)?
I might not be asking this clearly --- let me know what you think.

Read data file.

f <- sprintf("%s/%s", pathIn, "Requested Chemo Data domains kvd 11.19.15 2.xlsx")
echoFile(f)
## File: StudyDocuments/Requested Chemo Data domains kvd 11.19.15 2.xlsx
## Modification date: 2015-12-10 07:44:33
## File size: 178.9 KB
D0 <- read.xlsx(f, sheet=1, check.names=TRUE)
D0 <- data.table(D0)

Show a map of the column names and locations.

colNames <- data.frame(colNum = 1:ncol(D0),
                       colCell = c(LETTERS,
                                   sprintf("%s%s", LETTERS[1], LETTERS),
                                   sprintf("%s%s", LETTERS[2], LETTERS),
                                   sprintf("%s%s", LETTERS[3], LETTERS))[1:ncol(D0)],
                       varName = names(D0))
colNames
##    colNum colCell                  varName
## 1       1       A               First.Auth
## 2       2       B                Study.Ref
## 3       3       C                 Pub.Year
## 4       4       D                 Cog.Test
## 5       5       E    DOMAIN.FOR.META..kvd.
## 6       6       F                  Journal
## 7       7       G                 Pre.Meta
## 8       8       H                   Design
## 9       9       I                 Comp.Grp
## 10     10       J            Healthy_GROUP
## 11     11       K                   Tx.Grp
## 12     12       L   Pre.Post.Time.Interval
## 13     13       M                  Time.SD
## 14     14       N                     Tx.N
## 15     15       O                    Ctl.N
## 16     16       P                  Total.N
## 17     17       Q                   Tx.Age
## 18     18       R                Tx.Age.SD
## 19     19       S                  Ctl.Age
## 20     20       T               Ctl.Age.SD
## 21     21       U                    Tx.IQ
## 22     22       V                 Tx.IQ.SD
## 23     23       W                   Ctl.IQ
## 24     24       X                Ctl.IQ.SD
## 25     25       Y                  IQ.Note
## 26     26       Z                   Tx.EDU
## 27     27      AA                Tx.EDU.SD
## 28     28      AB                  Ctl.EDU
## 29     29      AC               Ctl.EDU.SD
## 30     30      AD                 EDU.Note
## 31     31      AE             Tx.Chem.Time
## 32     32      AF          Tx.Chem.Time.SD
## 33     33      AG Cognitive.Domain.Primary
## 34     34      AH                Score.Typ
## 35     35      AI                     Tx.M
## 36     36      AJ                    Tx.SD
## 37     37      AK                    Ctl.M
## 38     38      AL                   Ctl.SD
## 39     39      AM             Direct.Notes
## 40     40      AN                    X1.X2
## 41     41      AO                   Tx.N.1
## 42     42      AP                  Ctl.N.1
## 43     43      AQ                  Tx.SD.2
## 44     44      AR                 Ctl.SD.2
## 45     45      AS                  Spooled
## 46     46      AT                Cohen.s.d
## 47     47      AU                 Hedges.g
## 48     48      AV                     Var1
## 49     49      AW                     Var2
## 50     50      AX                 Variance
## 51     51      AY           Standard.Error
## 52     52      AZ                   Weight
## 53     53      BA                     w.ES
## 54     54      BB                   w.ES.2
## 55     55      BC                      w.2
## 56     56      BD                  StudyES
## 57     57      BE                  StudySE
## 58     58      BF                        z
## 59     59      BG                  LowerCI
## 60     60      BH                  UpperCI
## 61     61      BI                        Q
## 62     62      BJ                       df
## 63     63      BK               Q.Critical
## 64     64      BL           Q.Sig...p..05.
## 65     65      BM            RANDOM.EFFECT
## 66     66      BN                     RE_w
## 67     67      BO                   w.ES.1
## 68     68      BP                 w.ES.2.1
## 69     69      BQ                    w.2.1
## 70     70      BR                StudyES.1
## 71     71      BS                StudySE.1
## 72     72      BT                      z.1
## 73     73      BU                LowerCI.1
## 74     74      BV                UpperCI.1
## 75     75      BW                      Q.1
## 76     76      BX                     df.1
## 77     77      BY             Q.Critical.1
## 78     78      BZ         Q.Sig...p..05..1
## 79     79      CA                I.2.Fixed
## 80     80      CB               I.2.Random

Put the summary rows in a separate data table, DOno.

DOno <- D0[is.na(First.Auth) & !is.na(Weight), c(52:ncol(D0)), with=FALSE]

Put the instrument-level rows in a separate data table, D. Only keep the columns needed to calculate fixed and random effects statistics.

The RANDOM.EFFECT column was specific to the Ono analysis. The value in the Ono spreadsheet will be different for our use.

From: James Ogilvie [j.ogilvie@griffith.edu.au]
Sent: Sunday, October 18, 2015 5:42 PM
To: Benjamin Chan
Cc: 'jamelnikow@ucdavis.edu'; 'm.ono@griffith.edu.au';
'd.shum@griffith.edu.au'; Ayse Tezcan (aztezcan@ucdavis.edu); Meghan Soulsby
(masoulsby@ucdavis.edu)
Subject: Re: Fwd: request for data from your recently published meta-analysis

Hi Benjamin,

Thanks for contacting me regarding this issue. I had wondered whether Dr.
Melnikow had received the data I had sent, as I had not received confirmation
of my email containing the data.

These are very good questions! It took me a while to get my head around the
random effect model when performing this analysis. I am attaching an article
that I found very useful in coming to terms with the model - hopefully you
will find this useful too.

To answer your questions,   is a constant across a pool of studies that you
wish to examine and generate summary/aggregate statistics (e.g., grand mean
effect size). Therefore, the value of the constant will change depending on
the the specific pool of studies examined. It is calculated across the total
pool of studies.

  is the total Q statistic (assessing heterogeneity) that is calculated across
  ALL studies and relates to the grand mean effect size. It is not the same as
  the Q statistic in column BH. There is a Q statistic for each study (this is
  the Q in column BH), as well as a Q statistic for all studies pooled
  together (this being thestatistic). The formula for calculating the Q
  statistic are provided in the pdf I've attached titled "Heterogeneity in
  MA".

As I've mentioned, the value of   is specific to the pool of studies you are
examining. Therefore, the  value to calculate effect sizes according to a
random effects model will be different for your analyses - assuming you have a
different pool of studies that you are including in the analyses. Given this,
the  value in column BL needs to be updated by you to be specific to the pool
of studies you are looking at. 
importantVar <- c(1, 9:12, 14:17, 19, 35:39, 65, 33, 4, 5, 34)
authors <- c("Bender", "Collins", "Jenkins", "Wefel")
D <- D0[First.Auth %in% authors, importantVar, with=FALSE]
setnames(D,
         names(D),
         c("author",
           "comparisonGroup",
           "healthyGroup",
           "treatmentGroup",
           "timeDays",
           "nGroup1",
           "nGroup2",
           "nTotal",
           "ageGroup1",
           "ageGroup2",
           "meanGroup1",
           "sdGroup1",
           "meanGroup2",
           "sdGroup2",
           "direction",
           "randomEffect",  # Keep the value from Ono for verification purposes; do not use for analysis
           gsub("\\.", "", names(D0)[c(33, 4, 5, 34)])))
setnames(D, "DOMAINFORMETAkvd", "CognitiveDomainForMetaAnalysis")

The data in the received file is in the form of longitudinal means and standard deviations. Do not show

D

Replicate spreadsheet calculations.

D <- D[direction == "Lower worse",
       `:=` (diffMean = meanGroup2 - meanGroup1)]
D <- D[direction == "Greater worse",
       `:=` (diffMean = meanGroup1 - meanGroup2)]
D <- D[,
       `:=` (sdPooled = sqrt((((nGroup1 - 1) * (sdGroup1 ^ 2)) +
                                ((nGroup2 - 1) * (sdGroup2 ^ 2))) /
                               (nGroup1 + nGroup2 - 2)))]
D <- D[,
       `:=` (cohenD = diffMean / sdPooled)]
D <- D[,
       `:=` (hedgesG = cohenD * (1 - (3 / ((4 * nTotal) - 9))))]
D <- D[,
       `:=` (var1 = (nGroup1 + nGroup2) / (nGroup1 * nGroup2),
             var2 = hedgesG ^ 2 / (2 * (nGroup1 + nGroup2)))]
D <- D[,
       `:=` (variance = var1 + var2)]
D <- D[,
       `:=` (se = sqrt(variance),
             weightFE = 1 / variance)]
D <- D[,
       `:=` (effSizeWeightedFE = weightFE * hedgesG)]
D <- D[, weightRE := 1 / (variance + randomEffect)]
D <- D[, effSizeWeightedRE := weightRE * hedgesG]

Calculate fixed effects statisitcs.

DFixed <- D[!is.na(nTotal),
            .(df = .N,
              sumWeights = sum(weightFE),
              effSize = sum(effSizeWeightedFE) / sum(weightFE),
              se = sqrt(1 / sum(weightFE)),
              sumEffSizeWeighted = sum(effSizeWeightedFE),
              ssEffSizeWeighted = sum(weightFE * hedgesG ^ 2),
              ssWeights = sum(weightFE ^ 2)),
            .(author, timeDays)]
DFixed <- DFixed[,
                 `:=` (z = effSize / se,
                       lowerCI = effSize + qnorm(0.025) * se,
                       upperCI = effSize + qnorm(0.975) * se,
                       Q = ssEffSizeWeighted - (sumEffSizeWeighted ^ 2 / sumWeights),
                       criticalValue = qchisq(0.05, df, lower.tail=FALSE))]
DFixed <- DFixed[,
                 `:=` (pvalue = pchisq(Q, df, lower.tail=FALSE),
                       Isq = 100 * ((Q - df) / Q))]

Check if my calculations agree with Ono’s.

isCheckFixedPassed <- all.equal(DOno[, .(StudyES, z, Q)], 
                                DFixed[, .(effSize, z, Q)],
                                check.names=FALSE)
message(sprintf("Do my FIXED effect statistic calculations agree with Ono's? %s",
                isCheckFixedPassed))
## Do my FIXED effect statistic calculations agree with Ono's? TRUE
print(xtable(DFixed), type="html")
author timeDays df sumWeights effSize se sumEffSizeWeighted ssEffSizeWeighted ssWeights z lowerCI upperCI Q criticalValue pvalue Isq
1 Bender 182.62 16 96.80 1.02 0.10 98.53 241.49 626.88 10.01 0.82 1.22 141.21 26.30 0.00 88.67
2 Bender 547.50 16 63.53 0.55 0.13 34.76 285.90 290.59 4.36 0.30 0.79 266.88 26.30 0.00 94.00
3 Collins 537.90 23 604.56 0.21 0.04 124.90 39.49 15893.07 5.08 0.13 0.29 13.69 35.17 0.94 -68.01
4 Collins 146.50 23 607.30 0.10 0.04 58.14 17.63 16035.80 2.36 0.02 0.18 12.07 35.17 0.97 -90.58
5 Jenkins 364.00 14 592.05 0.08 0.04 47.58 23.62 25038.13 1.96 -0.00 0.16 19.79 23.68 0.14 29.27
6 Jenkins 28.00 14 593.46 0.03 0.04 19.46 12.29 25157.32 0.80 -0.05 0.11 11.65 23.68 0.63 -20.17
7 Wefel 182.62 10 89.09 0.18 0.11 15.73 5.24 793.76 1.67 -0.03 0.38 2.47 18.31 0.99 -305.57
8 Wefel 547.86 10 79.52 0.26 0.11 20.75 8.62 632.66 2.33 0.04 0.48 3.20 18.31 0.98 -212.29

Calculate random effects statisitcs.

DRandom <- D[!is.na(nTotal),
             .(df = .N,
               sumWeights = sum(weightRE),
               ssEffSizeWeighted = sum(weightRE * hedgesG ^ 2),
               ssWeights = sum(weightRE ^ 2),
               sumEffSizeWeighted = sum(effSizeWeightedRE),
               effSize = sum(effSizeWeightedRE) / sum(weightRE),
               se = sqrt(1 / sum(weightRE))),
             .(author, timeDays)]
DRandom <- DRandom[,
                   `:=` (z = effSize / se,
                         lowerCI = effSize + qnorm(0.025) * se,
                         upperCI = effSize + qnorm(0.975) * se,
                         Q = ssEffSizeWeighted - (sumEffSizeWeighted ^ 2 / sumWeights),
                         criticalValue = qchisq(0.05, df, lower.tail=FALSE))]
DRandom <- DRandom[,
                   `:=` (pvalue = pchisq(Q, df, lower.tail=FALSE),
                         Isq = 100 * ((Q - df) / Q))]

Check if my calculations agree with Ono’s.

isCheckRandomPassed <- all.equal(DOno[, c(19, 21, 24), with=FALSE], 
                                 DRandom[, .(effSize, z, Q)],
                                 check.names=FALSE)
message(sprintf("Do my RANDOM effect statistic calculations agree with Ono's? %s",
                isCheckRandomPassed))
## Do my RANDOM effect statistic calculations agree with Ono's? TRUE
print(xtable(DRandom), type="html")
author timeDays df sumWeights ssEffSizeWeighted ssWeights sumEffSizeWeighted effSize se z lowerCI upperCI Q criticalValue pvalue Isq
1 Bender 182.62 16 48.04 137.29 147.43 53.60 1.12 0.14 7.73 0.83 1.40 77.50 26.30 0.00 79.35
2 Bender 547.50 16 37.25 199.95 92.56 26.23 0.70 0.16 4.30 0.38 1.03 181.48 26.30 0.00 91.18
3 Collins 537.90 23 115.28 7.62 577.83 23.96 0.21 0.09 2.23 0.03 0.39 2.64 35.17 1.00 -770.38
4 Collins 146.50 23 115.38 3.38 578.84 11.11 0.10 0.09 1.03 -0.09 0.28 2.31 35.17 1.00 -895.09
5 Jenkins 364.00 14 75.63 3.04 408.57 6.11 0.08 0.11 0.70 -0.14 0.31 2.54 23.68 1.00 -450.68
6 Jenkins 28.00 14 75.65 1.57 408.83 2.50 0.03 0.11 0.29 -0.19 0.26 1.49 23.68 1.00 -840.71
7 Wefel 182.62 10 36.53 2.16 133.47 6.48 0.18 0.17 1.07 -0.15 0.50 1.01 18.31 1.00 -890.02
8 Wefel 547.86 10 34.81 3.79 121.21 9.12 0.26 0.17 1.55 -0.07 0.59 1.41 18.31 1.00 -611.34

Exclude tests Kathleen determined to be not useful.

From: Van Dyk, Kathleen [KVanDyk@mednet.ucla.edu]
Sent: Thursday, November 19, 2015 10:22 AM
To: Benjamin Chan
Cc: Ayse Tezcan
Subject: RE: Cognitive impairment draft paper

Hi Ben,
 
Ok --- attached is the Ono spreadsheet with my suggested domains.  I did
strikethrough for the measures we probably shouldn't include at all in the
domains to keep it somewhat uniform across tests (i.e., some folks used Trial
1 from a list-learning test, some just used Total and Delay, etc.).
strikethrough <- c("RAVL trial 6",
                   "CVLT Trial 1",
                   "RVLT trial 1",
                   "AVLT supraspan")
D <- D[!(CogTest %in% strikethrough)]

Domains and tests.

unique(D[, .(CognitiveDomainForMetaAnalysis, CogTest)])[order(CognitiveDomainForMetaAnalysis, CogTest)]
##     CognitiveDomainForMetaAnalysis                            CogTest
##  1:     Attn/Wkg Mem/Concentration               WAIS-III -Arithmetic
##  2:     Attn/Wkg Mem/Concentration                       4WSTM 15 sec
##  3:     Attn/Wkg Mem/Concentration                       4WSTM 30 sec
##  4:     Attn/Wkg Mem/Concentration                        4WSTM 5 sec
##  5:     Attn/Wkg Mem/Concentration                 Consonant trigrams
##  6:     Attn/Wkg Mem/Concentration Letter-number sequencing: WAIS-III
##  7:     Attn/Wkg Mem/Concentration               PASAT number correct
##  8:     Attn/Wkg Mem/Concentration              Spatial span: WMS-III
##  9:     Attn/Wkg Mem/Concentration                    TMT part A time
## 10:     Attn/Wkg Mem/Concentration                           Trails A
## 11:     Attn/Wkg Mem/Concentration                WAIS-III Digit span
## 12:     Attn/Wkg Mem/Concentration  WAIS-III Letter-number sequencing
## 13:     Attn/Wkg Mem/Concentration                  WAIS-R arithmetic
## 14:     Attn/Wkg Mem/Concentration                  WAIS-R digit span
## 15:     Attn/Wkg Mem/Concentration       WMS-III digit span backwards
## 16:     Attn/Wkg Mem/Concentration         WMS-III digit span forward
## 17:     Attn/Wkg Mem/Concentration   WMS-III letter number sequencing
## 18:     Attn/Wkg Mem/Concentration     WMS-III spatial span backwards
## 19:     Attn/Wkg Mem/Concentration      WMS-III spatial span forwards
## 20:                       Exec Fxn                             Stroop
## 21:                       Exec Fxn                    TMT part B time
## 22:                       Exec Fxn                           Trails B
## 23:                       Exec Fxn                WAIS-R similarities
## 24:                       Exec Fxn       WCST sorts divided by trials
## 25:         Information Proc Speed                Letter cancellation
## 26:         Information Proc Speed            Symbol search: WAIS-III
## 27:         Information Proc Speed       WAIS-III Digit Symbol Coding
## 28:         Information Proc Speed             WAIS-III Symbol search
## 29:         Information Proc Speed                WAIS-R digit symbol
## 30:                    Motor Speed             Grooved Peg Board time
## 31:                    Motor Speed     Grooved pegboard dominant hand
## 32:                    Motor Speed  Grooved pegboard nondominant hand
## 33:        Verbal Ability/Language  Boston Naming Test number correct
## 34:        Verbal Ability/Language  Verbal Fluency FAS number correct
## 35:        Verbal Ability/Language       Verbal fluency COWAT correct
## 36:                  Verbal Memory                       AVLT delayed
## 37:                  Verbal Memory                         AVLT total
## 38:                  Verbal Memory                CVLT delayed recall
## 39:                  Verbal Memory           CVLT delayed recognition
## 40:                  Verbal Memory                RAVL delayed recall
## 41:                  Verbal Memory                   RAVL total score
## 42:                  Verbal Memory                VSRT Delayed Recall
## 43:                  Verbal Memory             VSRT Long-Term Storage
## 44:                  Verbal Memory          WMS-III Logical memory II
## 45:                  Verbal Memory       WMS-III Story delayed recall
## 46:                  Verbal Memory     WMS-III Story immediate recall
## 47:                  Visual Memory             Complex figure delayed
## 48:                  Visual Memory           Complex figure immediate
## 49:                  Visual Memory               NVSRT Delayed Recall
## 50:                  Visual Memory                 RCF delayed recall
## 51:                  Visual Memory               RCF immediate recall
## 52:                  Visual Memory                RVLT delayed recall
## 53:                  Visual Memory           RVLT delayed recognition
## 54:                  Visual Memory         WMS-III Family pictures II
## 55:                   Visuospatial              WAIS-III Block design
## 56:                   Visuospatial                WAIS-R block design
##     CognitiveDomainForMetaAnalysis                            CogTest

Save working data tables to file if the integrity checks passed. I don’t need to save DOno since the integrity checks passed.

metadataD = makeMetadata(D)
metadataDFixed = makeMetadata(DFixed)
metadataDRandom = makeMetadata(DRandom)
if (isCheckFixedPassed & isCheckRandomPassed) {
  f <- sprintf("%s/%s", pathOut, "Ono.RData")
  save(D,
       metadataD,
       DFixed,
       metadataDFixed,
       DRandom,
       metadataDRandom,
       file=f)
  message(sprintf("%s saved on: %s\nFile size: %s KB", 
                  f,
                  file.mtime(f),
                  file.size(f) / 1e3))
} else {
  warning(sprinf("Integrity checks failed.\n%s not saved.", f))
}
## Output/Ono.RData saved on: 2015-12-18 10:24:22
## File size: 71.973 KB

4.2 Read Ahles

Read data from Ahles TA, et al. “Longitudinal Assessment of Cognitive Changes Associated With Adjuvant Treatment for Breast Cancer: Impact of Age and Cognitive Reserve.” J Clin Oncol. 2010 Oct 10; 28(29): 4434-4440.

Data file was requested and received from the co-author, Yuelin Li, in October 2015.

Read data file (text format).

f <- sprintf("%s/%s", pathIn, "Soulsby_means.txt")
echoFile(f)
## File: StudyDocuments/Soulsby_means.txt
## Modification date: 2015-12-10 07:44:33
## File size: 36.1 KB
D <- fread(f, sep="|")

The data in the received file is in the form of longitudinal means and standard deviations. Do not show

D

Study design.

D[, .(nrows = .N, totalN = sum(N)), .(txgrp, ptime)]
##        txgrp    ptime nrows totalN
##  1:    chemo baseline    35   2056
##  2:    chemo   posttx    35   1886
##  3:    chemo      1yr    35   1677
##  4:    chemo      2yr    35   1549
##  5: chemo no baseline    35   2432
##  6: chemo no   posttx    35   2321
##  7: chemo no      1yr    35   2237
##  8: chemo no      2yr    35   2138
##  9:  control baseline    35   1522
## 10:  control   posttx    35   1478
## 11:  control      1yr    35   1447
## 12:  control      2yr    35   1346

Map ptime to months after treatment. Ahles TA, et al. reports results in terms of

  • Baseline
  • 1 month after treatment
  • 6 months after treatment
  • 18 months after treatment

As far as I can tell, values of ptime map to these, although seemingly imprecise.

D[ptime == "baseline", monthsPostTx := 0]
D[ptime == "posttx", monthsPostTx := 1]
D[ptime == "1yr", monthsPostTx := 6]
D[ptime == "2yr", monthsPostTx := 18]

Exclude

  • Non-chemotherapy and control patients
D <- D[txgrp == "chemo"]

Instruments. Do not show

D[, .N, .(Variable, Label)]

Merge Kathleen’s KVanDyk@mednet.ucla.edu domain assignments.

From: Van Dyk, Kathleen [KVanDyk@mednet.ucla.edu]
Sent: Tuesday, November 03, 2015 5:08 PM
To: Ayse Tezcan
Cc: Benjamin Chan
Subject: RE: Cognitive impairment draft paper

Hi,
 
Attached is the Ono spreadsheet with a new column with my suggestions for
domains and domains for each Ahles test is in sheet 2.  I've highlighted tests
that we may want to exclude if we want to consistently keep one or two
measures per test.  Ben --- does it matter statistically if there is more than
one measure from the same test (for example delayed recall and delayed
recognition) in the same domain?  In almost every case we have total and delay
for memory tests but if we add in more measures (Trial 6, Supraspan,
Recognition) does this confound analyses because these are likely highly
correlated measures within the same test?  Would all of the studies need to
use the same measures in each test (i.e., every study uses Total and Delay)?
I might not be asking this clearly --- let me know what you think.
f <- sprintf("%s/%s", pathIn, "Requested Chemo Data domains kvd 11.19.15 2.xlsx")
echoFile(f)
## File: StudyDocuments/Requested Chemo Data domains kvd 11.19.15 2.xlsx
## Modification date: 2015-12-10 07:44:33
## File size: 178.9 KB
D0 <- read.xlsx(f, sheet=2, check.names=TRUE)
D0 <- data.table(D0)
CognitiveDomainForMetaAnalysis <- D0[!is.na(DOMAIN.FOR.META..kvd.), DOMAIN.FOR.META..kvd.]
lookup <- cbind(D[, .N, .(Variable, Label)], CognitiveDomainForMetaAnalysis)[, .(Variable, CognitiveDomainForMetaAnalysis)]
D <- merge(lookup, D, by="Variable")
unique(D[, .(CognitiveDomainForMetaAnalysis, Label)])[order(CognitiveDomainForMetaAnalysis, Label)]
##     CognitiveDomainForMetaAnalysis
##  1:     Attn/Wkg Mem/Concentration
##  2:     Attn/Wkg Mem/Concentration
##  3:     Attn/Wkg Mem/Concentration
##  4:     Attn/Wkg Mem/Concentration
##  5:     Attn/Wkg Mem/Concentration
##  6:     Attn/Wkg Mem/Concentration
##  7:     Attn/Wkg Mem/Concentration
##  8:     Attn/Wkg Mem/Concentration
##  9:     Attn/Wkg Mem/Concentration
## 10:     Attn/Wkg Mem/Concentration
## 11:                       Exec Fxn
## 12:                       Exec Fxn
## 13:                       Exec Fxn
## 14:                       Exec Fxn
## 15:                       Exec Fxn
## 16:                       Exec Fxn
## 17:                       Exec Fxn
## 18:         Information Proc Speed
## 19:         Information Proc Speed
## 20:         Information Proc Speed
## 21:         Information Proc Speed
## 22:                    Motor Speed
## 23:                    Motor Speed
## 24:                    Motor Speed
## 25:        Verbal Ability/Language
## 26:        Verbal Ability/Language
## 27:        Verbal Ability/Language
## 28:        Verbal Ability/Language
## 29:                  Verbal Memory
## 30:                  Verbal Memory
## 31:                  Verbal Memory
## 32:                  Verbal Memory
## 33:                  Visual Memory
## 34:                  Visual Memory
## 35:                   Visuospatial
##     CognitiveDomainForMetaAnalysis
##                                                  Label
##  1:            CPT: Distractibility, Correct Responses
##  2:              CPT: Distractibility, False Positives
##  3:                CPT: Distractibility, Reaction Time
##  4:                  CPT: Vigilance, Correct Responses
##  5:                    CPT: Vigilance, False Positives
##  6:                      CPT: Vigilance, Reaction Time
##  7:               DKEFS Trails: Letter Sequencing, sec
##  8:               DKEFS Trails: Number Sequencing, sec
##  9:                       PASAT (Rao): 2 second pacing
## 10:                       PASAT (Rao): 3 second pacing
## 11:        DKEFS Card Sorting: Confirmed Correct Sorts
## 12:                   DKEFS Card Sorting: Free Sorting
## 13:                           DKEFS Stroop: Color-Word
## 14:         DKEFS Trails: Number-Letter Switching, sec
## 15:       DKEFS Verbal Fluency: Switching Fruits/Veget
## 16:              DKEFS: Card Sorting, Sort Recognition
## 17:                        DKEFS: Stroop, Set Shifting
## 18:                               CVLT-2: Digit Symbol
## 19:                   DKEFS Stroop: Color Patch Naming
## 20:                    DKEFS Stroop: Word Reading, sec
## 21:           DKEFS Trails: Visual Scanning in Seconds
## 22:                     DKEFS Trails: Motor Speed, sec
## 23:              Grooved Pegboard Test: Left Hand, sec
## 24:             Grooved Pegboard Test: Right Hand, sec
## 25:                               DKEFS Verbal Fluency
## 26: DKEFS Verbal Fluency: anival or clothing and names
## 27:                                   WASI: Vocabulary
## 28:                               WRAT-3 Reading Score
## 29:                     CVLT-2: Long Delay Free Recall
## 30:                           CVLT-2: Trials 1-5 Total
## 31:          Wechsler Memory Scale-3: Logical Memory I
## 32:         Wechsler Memory Scale-3: Logical Memory II
## 33:                   Wechsler Memory Scale-3: Faces I
## 34:                  Wechsler Memory Scale-3: Faces II
## 35:                                 WASI: Block Design
##                                                  Label

Save working data tables to file.

metadata <- makeMetadata(D)
f <- sprintf("%s/%s", pathOut, "Ahles.RData")
save(D, metadata, file=f)
message(sprintf("%s saved on: %s\nFile size: %s KB", 
                f,
                file.mtime(f),
                file.size(f) / 1e3))
## Output/Ahles.RData saved on: 2015-12-18 10:24:23
## File size: 22.816 KB

4.3 Read Tager

Read data from Tager, FA, et al. “The cognitive effects of chemotherapy in post-menopausal breast cancer patients: a controlled longitudinal study.” Breast Cancer Res Treat. 2010 Aug;123(1):25-34.

Data file was requested and received from the co-author, Paula S. McKinley, on November 20, 2015.

Read data file (SPSS format).

f <- sprintf("%s/%s", pathIn, "Tager_DataForMetaAnalysis.sav")
echoFile(f)
## File: StudyDocuments/Tager_DataForMetaAnalysis.sav
## Modification date: 2015-12-10 07:44:33
## File size: 102.7 KB
D <- read_sav(f)
D <- data.table(D)
D <- D[,
       `:=` (session = factor(session,
                              levels = 1:4,
                              labels = c("Pre-surgery",
                                         "Post surgery before treatment",
                                         "Post treatment/6mths post surgery",
                                         "6 month follow-up")),
             chemoyn = factor(chemoyn,
                              levels= 0:1,
                              labels = c("No", "Yes")),
             CTregmen = factor(CTregmen,
                               levels = 1:3,
                               labels = c("AC",
                                          "ACT",
                                          "CMF")),
             tx = factor(tx,
                         levels = 0:11,
                         labels = c("None",
                                    "Chemo",
                                    "Radiation",
                                    "Tamoxifen",
                                    "Arimadex",
                                    "Chemo + Radiation",
                                    "Chemo + Tamoxifen",
                                    "Chemo + Arimadex",
                                    "Radiation + Tamoxifen",
                                    "Radiation + Arimadex",
                                    "Chemo + Radiation + Tamoxifen",
                                    "Chemo + Radiation + Arimadex")))]

Check data.

D[, .N, .(chemoyn, CTregmen)]
##    chemoyn CTregmen  N
## 1:      No       NA 89
## 2:     Yes      CMF 24
## 3:     Yes      ACT 40
## 4:     Yes       AC 21
D[, .N, .(chemoyn, chemowks)]
##    chemoyn chemowks  N
## 1:      No       88 89
## 2:     Yes       24 39
## 3:     Yes       16 14
## 4:     Yes       12  8
## 5:     Yes       28  3
## 6:     Yes       18  3
## 7:     Yes        8 12
## 8:     Yes       14  6

Keep z-score variables for these instruments.

  • Finger Tapper - Dom Hand
  • Finger Tapper - NonDom Hand
  • Pegboard - Dom Hand
  • Pegboard - Nondom Hand
  • COWAT
  • Boston Naming
  • Trail Making A
  • Trail Making B
  • WAIS-III Digit Symbol
  • WAIS-III Digit Span
  • WAIS-III Arithmetic
  • WAIS-III Number/Letter
  • Rey Copy
  • Buschke Total
  • Benton Visual Retention Correct
measures <- c("tapdomz",
              "tapndomz",
              "pegdomz",
              "pegndomz",
              "cowz",
              "bntz",
              "trlaz",
              "trlbz",
              "dsymz",
              "dspaz",
              "aritz",
              "numz",
              "reyz",
              "bustotz",
              "bvrcoz")

Melt data.

D <- melt(D,
          id.vars = c("subid", "session", "chemoyn", "chemowks", "CTregmen", "tx"),
          measure.vars = measures)
setnames(D, "variable", "Variable")
D <- D[Variable == "tapdomz", Label := "Finger Tapper - Dom Hand"]
D <- D[Variable == "tapndomz", Label := "Finger Tapper - NonDom Hand"]
D <- D[Variable == "pegdomz", Label := "Pegboard - Dom Hand"]
D <- D[Variable == "pegndomz", Label := "Pegboard - Nondom Hand"]
D <- D[Variable == "cowz", Label := "COWAT"]
D <- D[Variable == "bntz", Label := "Boston Naming"]
D <- D[Variable == "trlaz", Label := "Trail Making A"]
D <- D[Variable == "trlbz", Label := "Trail Making B"]
D <- D[Variable == "dsymz", Label := "WAIS-III Digit Symbol"]
D <- D[Variable == "dspaz", Label := "WAIS-III Digit Span"]
D <- D[Variable == "aritz", Label := "WAIS-III Arithmetic"]
D <- D[Variable == "numz", Label := "WAIS-III Number/Letter"]
D <- D[Variable == "reyz", Label := "Rey Copy"]
D <- D[Variable == "bustotz", Label := "Buschke Total "]
D <- D[Variable == "bvrcoz", Label := "Benton Visual Retention Correct"]
setkey(D, subid, session)

Exclude

  • Non-chemotherapy patients
  • Measurements before surgery
D <- D[chemoyn != "No" &
         session != "Pre-surgery"]
D[, .N, .(chemoyn, session)]
##    chemoyn                           session   N
## 1:     Yes     Post surgery before treatment 450
## 2:     Yes Post treatment/6mths post surgery 450
## 3:     Yes                 6 month follow-up 375

Calculate means and standard deviations

T <- D[,
       .(N = .N,
         meanZ = mean(value, na.rm=TRUE),
         sdZ = sd(value, na.rm=TRUE)),
       .(Variable,
         Label,
         session)]
setkey(T, Variable, Label, session)

Check against Table 2, column CT Group of Tager, FA, et al..

T1 <- T[session == "Post surgery before treatment"]
T1 <- T1[, x := sprintf("%.2f (%.2f)", meanZ, sdZ)]
T1[, .(Variable, Label, N, x)]
##     Variable                           Label  N            x
##  1:  tapdomz        Finger Tapper - Dom Hand 30  1.74 (1.21)
##  2: tapndomz     Finger Tapper - NonDom Hand 30  1.38 (1.11)
##  3:  pegdomz             Pegboard - Dom Hand 30 -0.18 (1.67)
##  4: pegndomz          Pegboard - Nondom Hand 30 -0.41 (1.64)
##  5:     cowz                           COWAT 30  0.24 (0.94)
##  6:     bntz                   Boston Naming 30 -0.33 (1.48)
##  7:    trlaz                  Trail Making A 30  0.40 (1.00)
##  8:    trlbz                  Trail Making B 30  0.32 (1.18)
##  9:    dsymz           WAIS-III Digit Symbol 30  0.69 (0.98)
## 10:    dspaz             WAIS-III Digit Span 30  0.23 (0.91)
## 11:    aritz             WAIS-III Arithmetic 30  0.09 (0.92)
## 12:     numz          WAIS-III Number/Letter 30  0.34 (0.90)
## 13:     reyz                        Rey Copy 30 -1.52 (2.84)
## 14:  bustotz                  Buschke Total  30 -0.60 (1.06)
## 15:   bvrcoz Benton Visual Retention Correct 30  0.01 (1.17)

Map session to months after treatment. Tager, FA, et al.

  • Baseline
  • 1 month after treatment
  • 6 months after treatment

As far as I can tell, values of ptime map to these, although seemingly imprecise.

T <- T[session == "Post surgery before treatment", monthsPostTx := 0]
T <- T[session == "Post treatment/6mths post surgery", monthsPostTx := 6]
T <- T[session == "6 month follow-up", monthsPostTx := 12]

Merge Kathleen’s KVanDyk@mednet.ucla.edu domain assignments.

From: Van Dyk, Kathleen [KVanDyk@mednet.ucla.edu]
Sent: Tuesday, November 03, 2015 5:08 PM
To: Ayse Tezcan
Cc: Benjamin Chan
Subject: RE: Cognitive impairment draft paper

Hi,
 
Attached is the Ono spreadsheet with a new column with my suggestions for
domains and domains for each Ahles test is in sheet 2.  I've highlighted tests
that we may want to exclude if we want to consistently keep one or two
measures per test.  Ben --- does it matter statistically if there is more than
one measure from the same test (for example delayed recall and delayed
recognition) in the same domain?  In almost every case we have total and delay
for memory tests but if we add in more measures (Trial 6, Supraspan,
Recognition) does this confound analyses because these are likely highly
correlated measures within the same test?  Would all of the studies need to
use the same measures in each test (i.e., every study uses Total and Delay)?
I might not be asking this clearly --- let me know what you think.
f <- sprintf("%s/%s", pathIn, "Requested Chemo Data domains kvd 11.19.15 2.xlsx")
echoFile(f)
## File: StudyDocuments/Requested Chemo Data domains kvd 11.19.15 2.xlsx
## Modification date: 2015-12-10 07:44:33
## File size: 178.9 KB
D0 <- read.xlsx(f, sheet=1, check.names=TRUE)
D0 <- data.table(D0)
D0 <- D0[First.Auth == "Tager" & !is.na(DOMAIN.FOR.META..kvd.),
         .(Label = Cog.Test,
           CognitiveDomainForMetaAnalysis = DOMAIN.FOR.META..kvd.)]
D0 <- D0[Label == "WAIS-IIIDigit Span",
         Label := "WAIS-III Digit Span"]
lookup <- D0
T <- merge(lookup, T, by="Label")
unique(T[, .(CognitiveDomainForMetaAnalysis, Label)])[order(CognitiveDomainForMetaAnalysis, Label)]
##     CognitiveDomainForMetaAnalysis                       Label
##  1:     Attn/Wkg Mem/Concentration              Trail Making A
##  2:     Attn/Wkg Mem/Concentration         WAIS-III Arithmetic
##  3:     Attn/Wkg Mem/Concentration         WAIS-III Digit Span
##  4:     Attn/Wkg Mem/Concentration      WAIS-III Number/Letter
##  5:                       Exec Fxn              Trail Making B
##  6:         Information Proc Speed       WAIS-III Digit Symbol
##  7:                    Motor Speed    Finger Tapper - Dom Hand
##  8:                    Motor Speed Finger Tapper - NonDom Hand
##  9:                    Motor Speed         Pegboard - Dom Hand
## 10:                    Motor Speed      Pegboard - Nondom Hand
## 11:        Verbal Ability/Language               Boston Naming
## 12:        Verbal Ability/Language                       COWAT
## 13:                  Verbal Memory              Buschke Total 
## 14:                   Visuospatial                    Rey Copy

Save working data tables to file.

metadata <- makeMetadata(T)
f <- sprintf("%s/%s", pathOut, "Tager.RData")
save(T, metadata, file=f)
message(sprintf("%s saved on: %s\nFile size: %s KB", 
                f,
                file.mtime(f),
                file.size(f) / 1e3))
## Output/Tager.RData saved on: 2015-12-18 10:24:23
## File size: 20.726 KB

4.4 Reshape Ono

Reshape the Ono data set so it has a similar structure to the Ahles and Tager data.

f <- sprintf("%s/%s", pathOut, "Ono.RData")
load(f, verbose=TRUE)
## Loading objects:
##   D
##   metadataD
##   DFixed
##   metadataDFixed
##   DRandom
##   metadataDRandom
metadataD$timeStamp
## [1] "2015-12-18 10:24:22 PST"
metadataD$colNames
##  [1] "author"                         "comparisonGroup"               
##  [3] "healthyGroup"                   "treatmentGroup"                
##  [5] "timeDays"                       "nGroup1"                       
##  [7] "nGroup2"                        "nTotal"                        
##  [9] "ageGroup1"                      "ageGroup2"                     
## [11] "meanGroup1"                     "sdGroup1"                      
## [13] "meanGroup2"                     "sdGroup2"                      
## [15] "direction"                      "randomEffect"                  
## [17] "CognitiveDomainPrimary"         "CogTest"                       
## [19] "CognitiveDomainForMetaAnalysis" "ScoreTyp"                      
## [21] "diffMean"                       "sdPooled"                      
## [23] "cohenD"                         "hedgesG"                       
## [25] "var1"                           "var2"                          
## [27] "variance"                       "se"                            
## [29] "weightFE"                       "effSizeWeightedFE"             
## [31] "weightRE"                       "effSizeWeightedRE"

Melt data.

idVars <- c("author",
            "comparisonGroup",
            "treatmentGroup",
            "timeDays",
            "CogTest",
            "CognitiveDomainPrimary",
            "CognitiveDomainForMetaAnalysis",
            "ScoreTyp",
            "ageGroup1")
DN <- melt(D, id.vars = idVars,
           measure.vars = c("nGroup1", "nGroup2"), value.name = "N",
           na.rm=TRUE)
DMean <- melt(D, id.vars = idVars,
              measure.vars = c("meanGroup1", "meanGroup2"), value.name = "mean",
              na.rm=TRUE)
DSD <- melt(D, id.vars = idVars,
            measure.vars = c("sdGroup1", "sdGroup2"), value.name = "sd",
            na.rm=TRUE)

Check studies. Do not show

D[, .N, .(author, comparisonGroup, treatmentGroup, timeDays, ageGroup1)]

Prepare measure data sets for merging.

DN    <- DN   [variable == "nGroup1"   , group := "Group 1"]
DMean <- DMean[variable == "meanGroup1", group := "Group 1"]
DSD   <- DSD  [variable == "sdGroup1"  , group := "Group 1"]
DN    <- DN   [variable == "nGroup2"   , group := "Group 2"]
DMean <- DMean[variable == "meanGroup2", group := "Group 2"]
DSD   <- DSD  [variable == "sdGroup2"  , group := "Group 2"]

Merge the melted data.

setkeyv(DN, c(idVars, "group"))
setkeyv(DMean, c(idVars, "group"))
setkeyv(DSD, c(idVars, "group"))
D <- merge(DN[, variable := NULL], DMean[, variable := NULL])
D <- merge(D, DSD[, variable := NULL])

Deduplicate pre-treatment data.

D1 <- D[group == "Group 1"]
setkeyv(D1, idVars[!(idVars %in% c("comparisonGroup", "treatmentGroup", "timeDays"))])
D1 <- unique(D1)
D1 <- D1[, monthsPostTx := 0]
D1 <- D1[,
         `:=` (comparisonGroup = NULL,
               treatmentGroup = NULL,
               timeDays = NULL,
               group = NULL)]

Calculate monthsPostRx for post-treatment values.

D2 <- D[group == "Group 2"]
D2 <- D2[, monthsPostTx := round(timeDays / 365.25 * 12)]
D2 <- D2[,
         `:=` (comparisonGroup = NULL,
               timeDays = NULL,
               group = NULL)]

rbind pre-treatment and post-treatment data.

D <- rbind(D1, D2, fill=TRUE)

Check data structure

unique(D[, .(author, monthsPostTx)])[order(author, monthsPostTx)]
##      author monthsPostTx
##  1:  Bender            0
##  2:  Bender            6
##  3:  Bender           18
##  4: Collins            0
##  5: Collins            5
##  6: Collins           18
##  7: Jenkins            0
##  8: Jenkins            1
##  9: Jenkins           12
## 10:   Wefel            0
## 11:   Wefel            6
## 12:   Wefel           18

Rename the age variable.

setnames(D, "ageGroup1", "age")

Overwrite the data to file.

metadata <- makeMetadata(D)
f <- sprintf("%s/%s", pathOut, "Ono.RData")
save(D, metadata, file=f)
message(sprintf("%s saved on: %s\nFile size: %s KB", 
                f,
                file.mtime(f),
                file.size(f) / 1e3))
## Output/Ono.RData saved on: 2015-12-18 10:24:24
## File size: 21.967 KB

4.5 Data abstraction

Create data sets from studies we had to abstract data from ourselves. I.e., data did not come from primary source authors or secondary source systematic reviews.

Structure of the data should be

  • author
  • monthsPostTx
  • treatmentGroup
  • cognitiveDomainOriginal (remove this column since we won’t use it)
  • cognitiveDomain
  • cognitiveTest
  • scoreType
  • n
  • mean
  • sd

4.5.1 Fan

Reference: Fan 2005, et al. J Clin Oncol. 2005 Nov 1;23(31):8025-32.

Data is in the Table 9.

There is a footnote to Table 9:

NOTE. Higher scores represent better function.

This is different from Trails A and B scores from other studies. Make sure to account for this different in combineData.Rmd.

Fan reports medians. We’ll assign their median values to the mean variable to keep things consistent.

Need to figure out what to do with sd

D <- rbind(data.table(monthsPostTx= 0, cognitiveTest="Trails A", mean=42.0, sd=NA, n=104, cognitiveDomain="Attn/Wkg Mem/Concentration"),
           data.table(monthsPostTx= 0, cognitiveTest="Trails B", mean=47.5, sd=NA, n=104, cognitiveDomain="Exec Fxn"),
           data.table(monthsPostTx=12, cognitiveTest="Trails A", mean=44.0, sd=NA, n= 91, cognitiveDomain="Attn/Wkg Mem/Concentration"),
           data.table(monthsPostTx=12, cognitiveTest="Trails B", mean=49.0, sd=NA, n= 91, cognitiveDomain="Exec Fxn"),
           data.table(monthsPostTx=24, cognitiveTest="Trails A", mean=47.0, sd=NA, n= 81, cognitiveDomain="Attn/Wkg Mem/Concentration"),
           data.table(monthsPostTx=24, cognitiveTest="Trails B", mean=50.0, sd=NA, n= 81, cognitiveDomain="Exec Fxn"))
D <- D[,
       `:=` (author = "Fan",
             treatmentGroup = "Chemotherapy",
             scoreType = "T score")]
D4a <- D
print(xtable(D4a), type="html")
monthsPostTx cognitiveTest mean sd n cognitiveDomain author treatmentGroup scoreType
1 0.00 Trails A 42.00 104.00 Attn/Wkg Mem/Concentration Fan Chemotherapy T score
2 0.00 Trails B 47.50 104.00 Exec Fxn Fan Chemotherapy T score
3 12.00 Trails A 44.00 91.00 Attn/Wkg Mem/Concentration Fan Chemotherapy T score
4 12.00 Trails B 49.00 91.00 Exec Fxn Fan Chemotherapy T score
5 24.00 Trails A 47.00 81.00 Attn/Wkg Mem/Concentration Fan Chemotherapy T score
6 24.00 Trails B 50.00 81.00 Exec Fxn Fan Chemotherapy T score

4.5.2 McDonald

Reference: McDonald 2012, et al. J Clin Oncol. 2012 Jul 10;30(20):2500-8. doi: 10.1200/JCO.2011.38.5674. Epub 2012 Jun 4

Data is in the Table A2 of the appendix.

D <- rbind(data.table(monthsPostTx= 0, cognitiveTest="0-back", mean=96.1, sd= 8.2),
           data.table(monthsPostTx= 0, cognitiveTest="1-back", mean=78.3, sd=30.1),
           data.table(monthsPostTx= 0, cognitiveTest="2-back", mean=80.1, sd=27.5),
           data.table(monthsPostTx= 0, cognitiveTest="3-back", mean=66.7, sd=25.2),
           data.table(monthsPostTx=12, cognitiveTest="0-back", mean=88.0, sd=21.9),
           data.table(monthsPostTx=12, cognitiveTest="1-back", mean=89.1, sd=13.2),
           data.table(monthsPostTx=12, cognitiveTest="2-back", mean=83.1, sd=16.1),
           data.table(monthsPostTx=12, cognitiveTest="3-back", mean=68.4, sd=22.9))
D <- D[,
       `:=` (author = "McDonald",
             treatmentGroup = "CTx+",
             cognitiveDomain = "Attn/Wkg Mem/Concentration",
             scoreType = "% accuracy",
             n = 16)]
D4b <- D
print(xtable(D4b), type="html")
monthsPostTx cognitiveTest mean sd author treatmentGroup cognitiveDomain scoreType n
1 0.00 0-back 96.10 8.20 McDonald CTx+ Attn/Wkg Mem/Concentration % accuracy 16.00
2 0.00 1-back 78.30 30.10 McDonald CTx+ Attn/Wkg Mem/Concentration % accuracy 16.00
3 0.00 2-back 80.10 27.50 McDonald CTx+ Attn/Wkg Mem/Concentration % accuracy 16.00
4 0.00 3-back 66.70 25.20 McDonald CTx+ Attn/Wkg Mem/Concentration % accuracy 16.00
5 12.00 0-back 88.00 21.90 McDonald CTx+ Attn/Wkg Mem/Concentration % accuracy 16.00
6 12.00 1-back 89.10 13.20 McDonald CTx+ Attn/Wkg Mem/Concentration % accuracy 16.00
7 12.00 2-back 83.10 16.10 McDonald CTx+ Attn/Wkg Mem/Concentration % accuracy 16.00
8 12.00 3-back 68.40 22.90 McDonald CTx+ Attn/Wkg Mem/Concentration % accuracy 16.00

4.5.3 Wefel 2010

Reference: Wefel 2010, et al Cancer. 2010 Jul 15;116(14):3348-56. doi: 10.1002/cncr.25098.

Data is in the Table 4. Use data from Time Point 1 and Time Point 4.

Cognitive testing was conducted at baseline [Time Point 1] and then on average 2.9 months (standard deviation “SD” = 0.59), 7.0 months (SD, 1.4), and 13.1 months (SD = 2.8) after baseline [Time Point 4].

D <- rbind(data.table(monthsPostTx= 0  , n=42, mean= 0.09, sd=0.86, cognitiveTest="Hopkins Verbal Learning Test Total", cognitiveDomain="Verbal Memory", scoreType="Z-score"),
           data.table(monthsPostTx= 0  , n=42, mean=-0.18, sd=2.51, cognitiveTest="Trail Making Part B", cognitiveDomain="Exec Fxn", scoreType="Z-score"),
           data.table(monthsPostTx= 0  , n=42, mean= 0.29, sd=0.96, cognitiveTest="MAE Controlled Oral Word Association", cognitiveDomain="Verbal Ability/Language", scoreType="Z-score"),
           data.table(monthsPostTx= 0  , n=42, mean=-0.34, sd=1.57, cognitiveTest="Trail Making Part A", cognitiveDomain="Attn/Wkg Mem/Concentration", scoreType="Z-score"),
           data.table(monthsPostTx= 0  , n=42, mean=11.71, sd=2.45, cognitiveTest="WAIS-R Digit Symbol", cognitiveDomain="Information Proc Speed", scoreType="Scaled score"),
           data.table(monthsPostTx= 0  , n=42, mean= 9.00, sd=2.48, cognitiveTest="WAIS-R Digit Span", cognitiveDomain="Attn/Wkg Mem/Concentration", scoreType="Scaled score"),
           data.table(monthsPostTx=13.1, n=28, mean=-0.44, sd=1.23, cognitiveTest="Hopkins Verbal Learning Test Total", cognitiveDomain="Verbal Memory", scoreType="Z-score"),
           data.table(monthsPostTx=13.1, n=28, mean= 0.15, sd=1.22, cognitiveTest="Trail Making Part B", cognitiveDomain="Exec Fxn", scoreType="Z-score"),
           data.table(monthsPostTx=13.1, n=28, mean= 0.30, sd=1.15, cognitiveTest="MAE Controlled Oral Word Association", cognitiveDomain="Verbal Ability/Language", scoreType="Z-score"),
           data.table(monthsPostTx=13.1, n=28, mean= 0.56, sd=1.29, cognitiveTest="Trail Making Part A", cognitiveDomain="Attn/Wkg Mem/Concentration", scoreType="Z-score"),
           data.table(monthsPostTx=13.1, n=28, mean=13.25, sd=2.03, cognitiveTest="WAIS-R Digit Symbol", cognitiveDomain="Information Proc Speed", scoreType="Scaled score"),
           data.table(monthsPostTx=13.1, n=28, mean=10.04, sd=2.67, cognitiveTest="WAIS-R Digit Span", cognitiveDomain="Attn/Wkg Mem/Concentration", scoreType="Scaled score"))
D <- D[,
       `:=` (author = "Wefel 2010",
             treatmentGroup = "Chemotherapy with or without paclitaxel")]
D4c <- D
print(xtable(D4c), type="html")
monthsPostTx n mean sd cognitiveTest cognitiveDomain scoreType author treatmentGroup
1 0.00 42.00 0.09 0.86 Hopkins Verbal Learning Test Total Verbal Memory Z-score Wefel 2010 Chemotherapy with or without paclitaxel
2 0.00 42.00 -0.18 2.51 Trail Making Part B Exec Fxn Z-score Wefel 2010 Chemotherapy with or without paclitaxel
3 0.00 42.00 0.29 0.96 MAE Controlled Oral Word Association Verbal Ability/Language Z-score Wefel 2010 Chemotherapy with or without paclitaxel
4 0.00 42.00 -0.34 1.57 Trail Making Part A Attn/Wkg Mem/Concentration Z-score Wefel 2010 Chemotherapy with or without paclitaxel
5 0.00 42.00 11.71 2.45 WAIS-R Digit Symbol Information Proc Speed Scaled score Wefel 2010 Chemotherapy with or without paclitaxel
6 0.00 42.00 9.00 2.48 WAIS-R Digit Span Attn/Wkg Mem/Concentration Scaled score Wefel 2010 Chemotherapy with or without paclitaxel
7 13.10 28.00 -0.44 1.23 Hopkins Verbal Learning Test Total Verbal Memory Z-score Wefel 2010 Chemotherapy with or without paclitaxel
8 13.10 28.00 0.15 1.22 Trail Making Part B Exec Fxn Z-score Wefel 2010 Chemotherapy with or without paclitaxel
9 13.10 28.00 0.30 1.15 MAE Controlled Oral Word Association Verbal Ability/Language Z-score Wefel 2010 Chemotherapy with or without paclitaxel
10 13.10 28.00 0.56 1.29 Trail Making Part A Attn/Wkg Mem/Concentration Z-score Wefel 2010 Chemotherapy with or without paclitaxel
11 13.10 28.00 13.25 2.03 WAIS-R Digit Symbol Information Proc Speed Scaled score Wefel 2010 Chemotherapy with or without paclitaxel
12 13.10 28.00 10.04 2.67 WAIS-R Digit Span Attn/Wkg Mem/Concentration Scaled score Wefel 2010 Chemotherapy with or without paclitaxel

4.5.4 Dumas

Reference: Dumas 2013, et al. Brain Imaging Behav. 2013 Dec; 7(4): 10.1007/s11682-013-9244-1.

Data is in the Table 3.

D <- rbind(data.table(monthsPostTx= 0, cognitiveTest="0-back sensitivity ", mean=2.27, sd=0.9),
           data.table(monthsPostTx= 0, cognitiveTest="1-back sensitivity ", mean=1.70, sd=1.2),
           data.table(monthsPostTx= 0, cognitiveTest="2-back sensitivity ", mean=1.89, sd=0.8),
           data.table(monthsPostTx= 0, cognitiveTest="3-back sensitivity ", mean=1.32, sd=0.9),
           data.table(monthsPostTx=12, cognitiveTest="0-back sensitivity ", mean=2.40, sd=0.8),
           data.table(monthsPostTx=12, cognitiveTest="1-back sensitivity ", mean=2.29, sd=1.0),
           data.table(monthsPostTx=12, cognitiveTest="2-back sensitivity ", mean=1.68, sd=0.7),
           data.table(monthsPostTx=12, cognitiveTest="3-back sensitivity ", mean=1.60, sd=0.8),
           data.table(monthsPostTx= 0, cognitiveTest="0-back bias ", mean=0.20, sd=0.3),
           data.table(monthsPostTx= 0, cognitiveTest="1-back bias ", mean=0.22, sd=0.5),
           data.table(monthsPostTx= 0, cognitiveTest="2-back bias ", mean=0.05, sd=0.4),
           data.table(monthsPostTx= 0, cognitiveTest="3-back bias ", mean=0.61, sd=0.3),
           data.table(monthsPostTx=12, cognitiveTest="0-back bias ", mean=0.26, sd=0.3),
           data.table(monthsPostTx=12, cognitiveTest="1-back bias ", mean=0.06, sd=0.2),
           data.table(monthsPostTx=12, cognitiveTest="2-back bias ", mean=0.03, sd=.03),
           data.table(monthsPostTx=12, cognitiveTest="3-back bias ", mean=0.32, sd=0.2))
D <- D[,
       `:=` (author = "Dumas",
             treatmentGroup = "Chemotherapy +",
             cognitiveDomain = "Attn/Wkg Mem/Concentration",
             scoreType = "",
             n = 9)]
D4d <- D
print(xtable(D4d), type="html")
monthsPostTx cognitiveTest mean sd author treatmentGroup cognitiveDomain scoreType n
1 0.00 0-back sensitivity 2.27 0.90 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
2 0.00 1-back sensitivity 1.70 1.20 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
3 0.00 2-back sensitivity 1.89 0.80 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
4 0.00 3-back sensitivity 1.32 0.90 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
5 12.00 0-back sensitivity 2.40 0.80 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
6 12.00 1-back sensitivity 2.29 1.00 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
7 12.00 2-back sensitivity 1.68 0.70 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
8 12.00 3-back sensitivity 1.60 0.80 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
9 0.00 0-back bias 0.20 0.30 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
10 0.00 1-back bias 0.22 0.50 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
11 0.00 2-back bias 0.05 0.40 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
12 0.00 3-back bias 0.61 0.30 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
13 12.00 0-back bias 0.26 0.30 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
14 12.00 1-back bias 0.06 0.20 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
15 12.00 2-back bias 0.03 0.03 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00
16 12.00 3-back bias 0.32 0.20 Dumas Chemotherapy + Attn/Wkg Mem/Concentration 9.00

4.6 Combine data from studies

Load data from

  1. Ono
  2. Ahles
  3. Tager
f <- sprintf("%s/%s", pathOut, "Ono.RData")
load(f, verbose=TRUE)
## Loading objects:
##   D
##   metadata
metadata$colNames
##  [1] "author"                         "CogTest"                       
##  [3] "CognitiveDomainPrimary"         "CognitiveDomainForMetaAnalysis"
##  [5] "ScoreTyp"                       "age"                           
##  [7] "N"                              "mean"                          
##  [9] "sd"                             "monthsPostTx"                  
## [11] "treatmentGroup"
D1 <- D
colNames1 <- metadataD$colNames
f <- sprintf("%s/%s", pathOut, "Ahles.RData")
load(f, verbose=TRUE)
## Loading objects:
##   D
##   metadata
metadata$colNames
##  [1] "Variable"                       "CognitiveDomainForMetaAnalysis"
##  [3] "txgrp"                          "ptime"                         
##  [5] "NObs"                           "Label"                         
##  [7] "N"                              "Mean"                          
##  [9] "Median"                         "StdDev"                        
## [11] "monthsPostTx"
D2 <- D
f <- sprintf("%s/%s", pathOut, "Tager.RData")
load(f, verbose=TRUE)
## Loading objects:
##   T
##   metadata
metadata$colNames
## [1] "Label"                          "CognitiveDomainForMetaAnalysis"
## [3] "Variable"                       "session"                       
## [5] "N"                              "meanZ"                         
## [7] "sdZ"                            "monthsPostTx"
D3 <- T

Structure of the data should be

  • author
  • monthsPostTx
  • treatmentGroup
  • cognitiveDomainOriginal (remove this column since we won’t use it)
  • cognitiveDomain
  • cognitiveTest
  • scoreType
  • n
  • mean
  • sd

Restructure Ono.

colOrder <- c("author",
              "monthsPostTx",
              "treatmentGroup",
              "cognitiveDomain",
              "cognitiveTest",
              "scoreType",
              "n",
              "mean",
              "sd")
setnames(D1,
         c("CogTest", "CognitiveDomainPrimary", "CognitiveDomainForMetaAnalysis", "ScoreTyp", "N"),
         c("cognitiveTest", "cognitiveDomainOriginal", "cognitiveDomain", "scoreType", "n"))
D1 <- D1[author == "Wefel", author := "Wefel 2004"]
D1 <- D1[scoreType == "z score", scoreType := "Z-score"]
D1 <- D1[scoreType == "Scaled scores", scoreType := "Scaled score"]
D1[,
   `:=` (cognitiveDomainOriginal = NULL)]
setcolorder(D1, c(colOrder, "age"))

Fix a data errors in Collins. Remove a duplicate row.

n0 <- nrow(D1)
D1 <- D1[!(author == "Collins" & monthsPostTx == 0 &
             cognitiveTest %in% c("Letter-number sequencing: WAIS-III", "Symbol search: WAIS-III"))]
message(sprintf("Removed %d rows", n0 - nrow(D1)))
## Removed 2 rows

Restructure Ahles.

D2 <- D2[, author := "Ahles"]
setnames(D2,
         c("CognitiveDomainForMetaAnalysis", "txgrp", "Label", "N", "Mean", "StdDev"),
         c("cognitiveDomain", "treatmentGroup", "cognitiveTest", "n", "mean", "sd"))
D2[,
   `:=` (Variable = NULL,
         ptime = NULL,
         NObs = NULL,
         Median = NULL,
         scoreType = "Z-score")]
setcolorder(D2, colOrder)

Restructure Tager.

D3 <- D3[, author := "Tager"]
setnames(D3,
         c("Label", "CognitiveDomainForMetaAnalysis", "N", "meanZ", "sdZ"),
         c("cognitiveTest", "cognitiveDomain", "n", "mean", "sd"))
D3[,
   `:=` (Variable = NULL,
         session = NULL,
         treatmentGroup = "Chemo",
         scoreType = "Z-score")]
setcolorder(D3, colOrder)

rbindlist the data.

D <- rbindlist(list(D1, D2, D3, D4a, D4b, D4c, D4d), use.names=TRUE, fill=TRUE)

Fill in age for these studies.

unique(D[is.na(age), author])
## [1] "Ahles"      "Tager"      "Fan"        "McDonald"   "Wefel 2010"
## [6] "Dumas"
D <- D[author == "Ahles"     , age := 51.7]
D <- D[author == "Tager"     , age := 60.3]
D <- D[author == "Fan"       , age := 48]
D <- D[author == "McDonald"  , age := 52.9]
D <- D[author == "Wefel 2010", age := 48.8]
D <- D[author == "Dumas"     , age := 57.1]

Standardize age.

age <- unique(D[, .(author, age)])
age <- age[, ageCentered := scale(age, center=TRUE, scale=FALSE)]
age[,
    .(meanRaw = mean(age),
      sdRaw = sd(age),
      meanCentered = mean(ageCentered),
      sdCentered = sd(ageCentered))]
##     meanRaw    sdRaw meanCentered sdCentered
## 1: 50.71182 6.210681 6.458297e-16   6.210681
age[order(age)]
##         author   age ageCentered
##  1:     Bender 40.11 -10.6018182
##  2:     Bender 44.13  -6.5818182
##  3: Wefel 2004 45.40  -5.3118182
##  4:        Fan 48.00  -2.7118182
##  5: Wefel 2010 48.80  -1.9118182
##  6:    Jenkins 51.49   0.7781818
##  7:      Ahles 51.70   0.9881818
##  8:   McDonald 52.90   2.1881818
##  9:      Dumas 57.10   6.3881818
## 10:    Collins 57.90   7.1881818
## 11:      Tager 60.30   9.5881818
D <- merge(D, age, by=c("author", "age"))

Identify tests where higher values are worse.

D <- D[, 
       isHigherWorse := 
         (grepl("sec|time", cognitiveTest, ignore.case=TRUE) &
            !(grepl("4WSTM", cognitiveTest) | grepl("PASAT", cognitiveTest))) |
         grepl("pegboard", cognitiveTest, ignore.case=TRUE) |
         (grepl("stroop", cognitiveTest, ignore.case=TRUE) & !grepl("^stroop$", cognitiveTest, ignore.case=TRUE))|
         (grepl("trail", cognitiveTest, ignore.case=TRUE) & author != "Fan")]
tests <- unique(D[, .(isHigherWorse, cognitiveDomain, cognitiveTest)])
setorder(tests, isHigherWorse, cognitiveDomain, cognitiveTest)
print(xtable(tests[isHigherWorse == TRUE]), type="html")
isHigherWorse cognitiveDomain cognitiveTest
1 TRUE Attn/Wkg Mem/Concentration CPT: Distractibility, Reaction Time
2 TRUE Attn/Wkg Mem/Concentration CPT: Vigilance, Reaction Time
3 TRUE Attn/Wkg Mem/Concentration DKEFS Trails: Letter Sequencing, sec
4 TRUE Attn/Wkg Mem/Concentration DKEFS Trails: Number Sequencing, sec
5 TRUE Attn/Wkg Mem/Concentration TMT part A time
6 TRUE Attn/Wkg Mem/Concentration Trail Making A
7 TRUE Attn/Wkg Mem/Concentration Trail Making Part A
8 TRUE Attn/Wkg Mem/Concentration Trails A
9 TRUE Exec Fxn DKEFS Stroop: Color-Word
10 TRUE Exec Fxn DKEFS Trails: Number-Letter Switching, sec
11 TRUE Exec Fxn DKEFS: Stroop, Set Shifting
12 TRUE Exec Fxn TMT part B time
13 TRUE Exec Fxn Trail Making B
14 TRUE Exec Fxn Trail Making Part B
15 TRUE Exec Fxn Trails B
16 TRUE Information Proc Speed DKEFS Stroop: Color Patch Naming
17 TRUE Information Proc Speed DKEFS Stroop: Word Reading, sec
18 TRUE Information Proc Speed DKEFS Trails: Visual Scanning in Seconds
19 TRUE Motor Speed DKEFS Trails: Motor Speed, sec
20 TRUE Motor Speed Grooved Peg Board time
21 TRUE Motor Speed Grooved Pegboard Test: Left Hand, sec
22 TRUE Motor Speed Grooved Pegboard Test: Right Hand, sec
23 TRUE Motor Speed Grooved pegboard dominant hand
24 TRUE Motor Speed Grooved pegboard nondominant hand
25 TRUE Motor Speed Pegboard - Dom Hand
26 TRUE Motor Speed Pegboard - Nondom Hand
print(xtable(tests[isHigherWorse == FALSE]), type="html")
isHigherWorse cognitiveDomain cognitiveTest
1 FALSE Attn/Wkg Mem/Concentration WAIS-III -Arithmetic
2 FALSE Attn/Wkg Mem/Concentration 0-back
3 FALSE Attn/Wkg Mem/Concentration 0-back bias
4 FALSE Attn/Wkg Mem/Concentration 0-back sensitivity
5 FALSE Attn/Wkg Mem/Concentration 1-back
6 FALSE Attn/Wkg Mem/Concentration 1-back bias
7 FALSE Attn/Wkg Mem/Concentration 1-back sensitivity
8 FALSE Attn/Wkg Mem/Concentration 2-back
9 FALSE Attn/Wkg Mem/Concentration 2-back bias
10 FALSE Attn/Wkg Mem/Concentration 2-back sensitivity
11 FALSE Attn/Wkg Mem/Concentration 3-back
12 FALSE Attn/Wkg Mem/Concentration 3-back bias
13 FALSE Attn/Wkg Mem/Concentration 3-back sensitivity
14 FALSE Attn/Wkg Mem/Concentration 4WSTM 15 sec
15 FALSE Attn/Wkg Mem/Concentration 4WSTM 30 sec
16 FALSE Attn/Wkg Mem/Concentration 4WSTM 5 sec
17 FALSE Attn/Wkg Mem/Concentration CPT: Distractibility, Correct Responses
18 FALSE Attn/Wkg Mem/Concentration CPT: Distractibility, False Positives
19 FALSE Attn/Wkg Mem/Concentration CPT: Vigilance, Correct Responses
20 FALSE Attn/Wkg Mem/Concentration CPT: Vigilance, False Positives
21 FALSE Attn/Wkg Mem/Concentration Consonant trigrams
22 FALSE Attn/Wkg Mem/Concentration Letter-number sequencing: WAIS-III
23 FALSE Attn/Wkg Mem/Concentration PASAT (Rao): 2 second pacing
24 FALSE Attn/Wkg Mem/Concentration PASAT (Rao): 3 second pacing
25 FALSE Attn/Wkg Mem/Concentration PASAT number correct
26 FALSE Attn/Wkg Mem/Concentration Spatial span: WMS-III
27 FALSE Attn/Wkg Mem/Concentration Trails A
28 FALSE Attn/Wkg Mem/Concentration WAIS-III Arithmetic
29 FALSE Attn/Wkg Mem/Concentration WAIS-III Digit Span
30 FALSE Attn/Wkg Mem/Concentration WAIS-III Digit span
31 FALSE Attn/Wkg Mem/Concentration WAIS-III Letter-number sequencing
32 FALSE Attn/Wkg Mem/Concentration WAIS-III Number/Letter
33 FALSE Attn/Wkg Mem/Concentration WAIS-R Digit Span
34 FALSE Attn/Wkg Mem/Concentration WAIS-R arithmetic
35 FALSE Attn/Wkg Mem/Concentration WAIS-R digit span
36 FALSE Attn/Wkg Mem/Concentration WMS-III digit span backwards
37 FALSE Attn/Wkg Mem/Concentration WMS-III digit span forward
38 FALSE Attn/Wkg Mem/Concentration WMS-III letter number sequencing
39 FALSE Attn/Wkg Mem/Concentration WMS-III spatial span backwards
40 FALSE Attn/Wkg Mem/Concentration WMS-III spatial span forwards
41 FALSE Exec Fxn DKEFS Card Sorting: Confirmed Correct Sorts
42 FALSE Exec Fxn DKEFS Card Sorting: Free Sorting
43 FALSE Exec Fxn DKEFS Verbal Fluency: Switching Fruits/Veget
44 FALSE Exec Fxn DKEFS: Card Sorting, Sort Recognition
45 FALSE Exec Fxn Stroop
46 FALSE Exec Fxn Trails B
47 FALSE Exec Fxn WAIS-R similarities
48 FALSE Exec Fxn WCST sorts divided by trials
49 FALSE Information Proc Speed CVLT-2: Digit Symbol
50 FALSE Information Proc Speed Letter cancellation
51 FALSE Information Proc Speed Symbol search: WAIS-III
52 FALSE Information Proc Speed WAIS-III Digit Symbol
53 FALSE Information Proc Speed WAIS-III Digit Symbol Coding
54 FALSE Information Proc Speed WAIS-III Symbol search
55 FALSE Information Proc Speed WAIS-R Digit Symbol
56 FALSE Information Proc Speed WAIS-R digit symbol
57 FALSE Motor Speed Finger Tapper - Dom Hand
58 FALSE Motor Speed Finger Tapper - NonDom Hand
59 FALSE Verbal Ability/Language Boston Naming
60 FALSE Verbal Ability/Language Boston Naming Test number correct
61 FALSE Verbal Ability/Language COWAT
62 FALSE Verbal Ability/Language DKEFS Verbal Fluency
63 FALSE Verbal Ability/Language DKEFS Verbal Fluency: anival or clothing and names
64 FALSE Verbal Ability/Language MAE Controlled Oral Word Association
65 FALSE Verbal Ability/Language Verbal Fluency FAS number correct
66 FALSE Verbal Ability/Language Verbal fluency COWAT correct
67 FALSE Verbal Ability/Language WASI: Vocabulary
68 FALSE Verbal Ability/Language WRAT-3 Reading Score
69 FALSE Verbal Memory AVLT delayed
70 FALSE Verbal Memory AVLT total
71 FALSE Verbal Memory Buschke Total
72 FALSE Verbal Memory CVLT delayed recall
73 FALSE Verbal Memory CVLT delayed recognition
74 FALSE Verbal Memory CVLT-2: Long Delay Free Recall
75 FALSE Verbal Memory CVLT-2: Trials 1-5 Total
76 FALSE Verbal Memory Hopkins Verbal Learning Test Total
77 FALSE Verbal Memory RAVL delayed recall
78 FALSE Verbal Memory RAVL total score
79 FALSE Verbal Memory WMS-III Logical memory II
80 FALSE Verbal Memory WMS-III Story delayed recall
81 FALSE Verbal Memory WMS-III Story immediate recall
82 FALSE Verbal Memory Wechsler Memory Scale-3: Logical Memory I
83 FALSE Verbal Memory Wechsler Memory Scale-3: Logical Memory II
84 FALSE Visual Memory Complex figure delayed
85 FALSE Visual Memory Complex figure immediate
86 FALSE Visual Memory RCF delayed recall
87 FALSE Visual Memory RCF immediate recall
88 FALSE Visual Memory RVLT delayed recall
89 FALSE Visual Memory RVLT delayed recognition
90 FALSE Visual Memory WMS-III Family pictures II
91 FALSE Visual Memory Wechsler Memory Scale-3: Faces I
92 FALSE Visual Memory Wechsler Memory Scale-3: Faces II
93 FALSE Visuospatial Rey Copy
94 FALSE Visuospatial WAIS-III Block design
95 FALSE Visuospatial WAIS-R block design
96 FALSE Visuospatial WASI: Block Design

Output to CSV for Kathleen to verify. No longer needed. See issue #7.

f <- "tests.csv"
write.csv(tests, f, row.names=FALSE)

Merge pre-treatment measures to 12+ month post-treatment measures.

D[, .N, .(author, monthsPostTx)][order(author, monthsPostTx)]
##         author monthsPostTx  N
##  1:      Ahles          0.0 35
##  2:      Ahles          1.0 35
##  3:      Ahles          6.0 35
##  4:      Ahles         18.0 35
##  5:     Bender          0.0 14
##  6:     Bender          6.0 14
##  7:     Bender         18.0 14
##  8:    Collins          0.0 21
##  9:    Collins          5.0 21
## 10:    Collins         18.0 21
## 11:      Dumas          0.0  8
## 12:      Dumas         12.0  8
## 13:        Fan          0.0  2
## 14:        Fan         12.0  2
## 15:        Fan         24.0  2
## 16:    Jenkins          0.0 13
## 17:    Jenkins          1.0 13
## 18:    Jenkins         12.0 13
## 19:   McDonald          0.0  4
## 20:   McDonald         12.0  4
## 21:      Tager          0.0 14
## 22:      Tager          6.0 14
## 23:      Tager         12.0 14
## 24: Wefel 2004          0.0 10
## 25: Wefel 2004          6.0 10
## 26: Wefel 2004         18.0 10
## 27: Wefel 2010          0.0  6
## 28: Wefel 2010         13.1  6
##         author monthsPostTx  N
DPre  <- D[monthsPostTx == 0]
DPre [, .N, .(author, monthsPostTx)][order(author, monthsPostTx)]
##         author monthsPostTx  N
##  1:      Ahles            0 35
##  2:     Bender            0 14
##  3:    Collins            0 21
##  4:      Dumas            0  8
##  5:        Fan            0  2
##  6:    Jenkins            0 13
##  7:   McDonald            0  4
##  8:      Tager            0 14
##  9: Wefel 2004            0 10
## 10: Wefel 2010            0  6
DPost <- D[12 <= monthsPostTx]
DPost[, .N, .(author, monthsPostTx)][order(author, monthsPostTx)]
##         author monthsPostTx  N
##  1:      Ahles         18.0 35
##  2:     Bender         18.0 14
##  3:    Collins         18.0 21
##  4:      Dumas         12.0  8
##  5:        Fan         12.0  2
##  6:        Fan         24.0  2
##  7:    Jenkins         12.0 13
##  8:   McDonald         12.0  4
##  9:      Tager         12.0 14
## 10: Wefel 2004         18.0 10
## 11: Wefel 2010         13.1  6
key <- c("author", "age", "ageCentered", "cognitiveDomain", "cognitiveTest", "isHigherWorse", "scoreType")
setkeyv(DPre , key)
setkeyv(DPost, key)
D <- merge(DPre, DPost, suffixes=c("Pre", "Post"))

If the cognitive test where high values are worse, then flip the signs so the pre-post difference will have the same direction as tests where high values are better.

D <- D[isHigherWorse == TRUE,
       `:=` (meanPre = -meanPre,
             meanPost = -meanPost)]
message(sprintf("%d rows were flipped", nrow(D[isHigherWorse == TRUE])))
## 26 rows were flipped

Calculate effect sizes.

calcFixed <- function (D) {
  escalc("SMD", data=D,
         m1i=meanPost, sd1i=sdPost, n1i=nPost,
         m2i=meanPre,  sd2i=sdPre,  n2i=nPre)
}
l <- list(calcFixed(D[cognitiveDomain == "Attn/Wkg Mem/Concentration"]),
          calcFixed(D[cognitiveDomain == "Verbal Memory"]),
          calcFixed(D[cognitiveDomain == "Visual Memory"]),
          calcFixed(D[cognitiveDomain == "Verbal Ability/Language"]),
          calcFixed(D[cognitiveDomain == "Motor Speed"]),
          calcFixed(D[cognitiveDomain == "Information Proc Speed"]),
          calcFixed(D[cognitiveDomain == "Exec Fxn"]),
          calcFixed(D[cognitiveDomain == "Visuospatial"]))
D <- rbindlist(l)

Shorten domain labels.

setnames(D, c("cognitiveDomain", "cognitiveTest"), c("domain", "test"))
D <- D[domain == "Attn/Wkg Mem/Concentration", domain := "Attn/Wkg Mem/Concen"]
D <- D[domain == "Verbal Memory", domain := "Verb Mem"]
D <- D[domain == "Visual Memory", domain := "Vis Mem"]
D <- D[domain == "Verbal Ability/Language", domain := "Verb Ability/Lang"]
# D <- D[domain == "Motor Speed", domain := ""]
D <- D[domain == "Information Proc Speed", domain := "Info Proc Speed"]
# D <- D[domain == "Exec Fxn", domain := ""]
# D <- D[domain == "Visuospatial", domain := ""]
D <- D[, domain := factor(domain)]
D[, .N, domain]
##                 domain  N
## 1: Attn/Wkg Mem/Concen 51
## 2:            Verb Mem 17
## 3:             Vis Mem 11
## 4:   Verb Ability/Lang 10
## 5:         Motor Speed 10
## 6:     Info Proc Speed 10
## 7:            Exec Fxn 16
## 8:        Visuospatial  4

Trim leading and trailing whitespace.

D <- D[, test := gsub("^[[:space:]]*", "", test)]
D <- D[, test := gsub("[[:space:]]*$", "", test)]

Standardize test labels.

D <- D[, test := gsub(":", "", test)]
D <- D[, test := gsub("anival", "animal", test)]
D <- D[, test := gsub("Wechsler Memory Scale-3", "WMS-III", test)]
D <- D[, test := gsub("Trails A", "TMT A", test)]
D <- D[, test := gsub("Trail Making A", "TMT A", test)]
D <- D[, test := gsub("Trail Making Part A", "TMT A", test)]
D <- D[, test := gsub("TMT part A time", "TMT A", test)]
D <- D[, test := gsub("Trails B", "TMT B", test)]
D <- D[, test := gsub("Trail Making B", "TMT B", test)]
D <- D[, test := gsub("Trail Making Part B", "TMT B", test)]
D <- D[, test := gsub("TMT part B time", "TMT B", test)]
D <- D[, test := gsub(" in Seconds", ", sec", test)]
D <- D[, test := gsub("second", "sec", test)]
D <- D[, test := gsub(" - ", " ", test)]
D <- D[, test := gsub("WAIS-III -Arithmetic", "WAIS-III Arithmetic", test)]
D <- D[, test := gsub("WAIS-III Letter-number sequencing", "WAIS-III Letter-number", test)]
D <- D[, test := gsub("WAIS-III Number/Letter", "WAIS-III Letter-number", test)]
D <- D[, test := gsub("Spatial span WMS-III", "WMS-III Spatial span", test)]
D <- D[, test := gsub("Verbal fluency COWAT correct", "COWAT Verbal fluency correct", test)]
D <- D[, test := gsub("^Boston Naming Test number correct$", "Boston Naming Test", test)]
D <- D[, test := gsub("^Boston Naming$", "Boston Naming Test", test)]
D <- D[, test := gsub("Peg Board time", "Pegboard, sec", test)]
D <- D[, test := gsub("^Pegboard", "Grooved Pegboard", test)]
D <- D[, test := gsub("dominant hand", "Dom Hand", test)]
D <- D[, test := gsub("nondominant hand", "Nondom Hand", test)]
D <- D[, test := gsub("nonDom", "Nondom", test)]
D <- D[, test := gsub("Grooved Pegboard Test", "Grooved Pegboard", test)]
D <- D[, test := toTitleCase(test)]
D <- D[, test := gsub("4wstm", "4WSTM", test)]
D <- D[, test := gsub("TMT a", "TMT A", test)]
unique(D[, test])[order(unique(D[, test]))]
##   [1] "0-Back"                                           
##   [2] "0-Back Bias"                                      
##   [3] "0-Back Sensitivity"                               
##   [4] "1-Back"                                           
##   [5] "1-Back Bias"                                      
##   [6] "1-Back Sensitivity"                               
##   [7] "2-Back"                                           
##   [8] "2-Back Bias"                                      
##   [9] "2-Back Sensitivity"                               
##  [10] "3-Back"                                           
##  [11] "3-Back Bias"                                      
##  [12] "3-Back Sensitivity"                               
##  [13] "4WSTM 15 Sec"                                     
##  [14] "4WSTM 30 Sec"                                     
##  [15] "4WSTM 5 Sec"                                      
##  [16] "AVLT Delayed"                                     
##  [17] "AVLT Total"                                       
##  [18] "Boston Naming Test"                               
##  [19] "Buschke Total"                                    
##  [20] "Complex Figure Delayed"                           
##  [21] "Complex Figure Immediate"                         
##  [22] "Consonant Trigrams"                               
##  [23] "COWAT"                                            
##  [24] "COWAT Verbal Fluency Correct"                     
##  [25] "CPT Distractibility, Correct Responses"           
##  [26] "CPT Distractibility, False Positives"             
##  [27] "CPT Distractibility, Reaction Time"               
##  [28] "CPT Vigilance, Correct Responses"                 
##  [29] "CPT Vigilance, False Positives"                   
##  [30] "CPT Vigilance, Reaction Time"                     
##  [31] "CVLT-2 Digit Symbol"                              
##  [32] "CVLT-2 Long Delay Free Recall"                    
##  [33] "CVLT-2 Trials 1-5 Total"                          
##  [34] "CVLT Delayed Recall"                              
##  [35] "CVLT Delayed Recognition"                         
##  [36] "DKEFS Card Sorting Confirmed Correct Sorts"       
##  [37] "DKEFS Card Sorting Free Sorting"                  
##  [38] "DKEFS Card Sorting, Sort Recognition"             
##  [39] "DKEFS Stroop Color-Word"                          
##  [40] "DKEFS Stroop Color Patch Naming"                  
##  [41] "DKEFS Stroop Word Reading, Sec"                   
##  [42] "DKEFS Stroop, Set Shifting"                       
##  [43] "DKEFS Trails Letter Sequencing, Sec"              
##  [44] "DKEFS Trails Motor Speed, Sec"                    
##  [45] "DKEFS Trails Number-Letter Switching, Sec"        
##  [46] "DKEFS Trails Number Sequencing, Sec"              
##  [47] "DKEFS Trails Visual Scanning, Sec"                
##  [48] "DKEFS Verbal Fluency"                             
##  [49] "DKEFS Verbal Fluency Animal or Clothing and Names"
##  [50] "DKEFS Verbal Fluency Switching Fruits/Veget"      
##  [51] "Finger Tapper Dom Hand"                           
##  [52] "Finger Tapper NonDom Hand"                        
##  [53] "Grooved Pegboard Dom Hand"                        
##  [54] "Grooved Pegboard Left Hand, Sec"                  
##  [55] "Grooved Pegboard Nondom Hand"                     
##  [56] "Grooved Pegboard Right Hand, Sec"                 
##  [57] "Grooved Pegboard, Sec"                            
##  [58] "Hopkins Verbal Learning Test Total"               
##  [59] "Letter Cancellation"                              
##  [60] "MAE Controlled Oral Word Association"             
##  [61] "PASAT (Rao) 2 Sec Pacing"                         
##  [62] "PASAT (Rao) 3 Sec Pacing"                         
##  [63] "PASAT Number Correct"                             
##  [64] "RAVL Delayed Recall"                              
##  [65] "RAVL Total Score"                                 
##  [66] "RCF Delayed Recall"                               
##  [67] "RCF Immediate Recall"                             
##  [68] "Rey Copy"                                         
##  [69] "RVLT Delayed Recall"                              
##  [70] "RVLT Delayed Recognition"                         
##  [71] "Stroop"                                           
##  [72] "TMT A"                                            
##  [73] "TMT B"                                            
##  [74] "Verbal Fluency FAS Number Correct"                
##  [75] "WAIS-III Arithmetic"                              
##  [76] "WAIS-III Block Design"                            
##  [77] "WAIS-III Digit Span"                              
##  [78] "WAIS-III Digit Symbol"                            
##  [79] "WAIS-III Digit Symbol Coding"                     
##  [80] "WAIS-III Letter-Number"                           
##  [81] "WAIS-III Symbol Search"                           
##  [82] "WAIS-R Arithmetic"                                
##  [83] "WAIS-R Block Design"                              
##  [84] "WAIS-R Digit Span"                                
##  [85] "WAIS-R Digit Symbol"                              
##  [86] "WAIS-R Similarities"                              
##  [87] "WASI Block Design"                                
##  [88] "WASI Vocabulary"                                  
##  [89] "WCST Sorts Divided by Trials"                     
##  [90] "WMS-III Digit Span Backwards"                     
##  [91] "WMS-III Digit Span Forward"                       
##  [92] "WMS-III Faces I"                                  
##  [93] "WMS-III Faces II"                                 
##  [94] "WMS-III Family Pictures II"                       
##  [95] "WMS-III Letter Number Sequencing"                 
##  [96] "WMS-III Logical Memory I"                         
##  [97] "WMS-III Logical Memory II"                        
##  [98] "WMS-III Spatial Span"                             
##  [99] "WMS-III Spatial Span Backwards"                   
## [100] "WMS-III Spatial Span Forwards"                    
## [101] "WMS-III Story Delayed Recall"                     
## [102] "WMS-III Story Immediate Recall"                   
## [103] "WRAT-3 Reading Score"

Create slab variable for study label. Add additional information for Bender.

D <- D[, slab := sprintf("%s: %s", author, test)]
D <- D[author == "Bender" & treatmentGroupPost == "Chemotherapy",
       slab := sprintf("%s (%s)", slab, "CT alone")]
D <- D[author == "Bender" & treatmentGroupPost == "Chemotherapy + Tamoxifen",
       slab := sprintf("%s (%s)", slab, "CT + tamoxifen")]
D <- D[, `:=` (treatmentGroupPre = NULL, treatmentGroupPost = NULL)]

Order the data.

setorder(D, domain, author, test)

Remove studies with missing data.

unique(D[is.na(yi), .(author, domain, test, yi)])
##    author              domain  test yi
## 1:    Fan Attn/Wkg Mem/Concen TMT A NA
## 2:    Fan            Exec Fxn TMT B NA
D <- D[!is.na(yi)]

Add id variable. Will need this for the random effect.

D <- D[, id := factor(1:nrow(D))]

Save working data tables to file.

metadata <- makeMetadata(D)
f <- sprintf("%s/%s", pathOut, "AllStudies.RData")
save(D, metadata, file=f)
message(sprintf("%s saved on: %s\nFile size: %s KB", 
                f,
                file.mtime(f),
                file.size(f) / 1e3))
## Output/AllStudies.RData saved on: 2015-12-18 10:24:25
## File size: 27.84 KB

5 Meta-analysis

Standardized mean differences between pre-treatment and 12+ month post-treatment cognitive impairment measures is modeled with a multilevel mixed effects model. Cognitive domain is modeled as a fixed effect, with one effect size for each of the 8 domains.

In our study, we have multiple measurements within cognitive domain. So, data points are correlated within study.

Variance components for cognitive test and for study are included in the model. The variance component for cognitive test assumes each test is drawn from a large population of tests. The variance component for study models the correlation of test results within each study.

In addition, study-level mean age is included as a moderator. Age is centered around a mean of 50.7.

Mathematically, the model is represented as

\[ y = \sum_{i=1}^\text{# of domains} \beta_i + \gamma_\text{age} + \sigma_\text{test} + \sigma_\text{study} \]

A model to estimate a global effect is

\[ y = \beta + \gamma_\text{age} + \sigma_\text{test} + \sigma_\text{study} \]

Models were estimated using the rma.mv() function from the metafor package for R.

citation("metafor")
## 
## To cite the metafor package in publications, please use:
## 
##   Viechtbauer, W. (2010). Conducting meta-analyses in R with the
##   metafor package. Journal of Statistical Software, 36(3), 1-48.
##   URL: http://www.jstatsoft.org/v36/i03/
## 
## A BibTeX entry for LaTeX users is
## 
##   @Article{,
##     title = {Conducting meta-analyses in {R} with the {metafor} package},
##     author = {Wolfgang Viechtbauer},
##     journal = {Journal of Statistical Software},
##     year = {2010},
##     volume = {36},
##     number = {3},
##     pages = {1--48},
##     url = {http://www.jstatsoft.org/v36/i03/},
##   }

An additional reference is

Konstantopoulos, S. (2011), Fixed effects and variance components estimation in three-level meta-analysis. Res. Synth. Method, 2: 61-76. doi: 10.1002/jrsm.35

Load tidy data.

f <- sprintf("%s/%s", pathOut, "AllStudies.RData")
load(f, verbose=TRUE)
## Loading objects:
##   D
##   metadata
metadata$timeStamp
## [1] "2015-12-18 10:24:25 PST"
metadata$colNames
##  [1] "author"           "age"              "ageCentered"     
##  [4] "domain"           "test"             "isHigherWorse"   
##  [7] "scoreType"        "monthsPostTxPre"  "nPre"            
## [10] "meanPre"          "sdPre"            "monthsPostTxPost"
## [13] "nPost"            "meanPost"         "sdPost"          
## [16] "yi"               "vi"               "slab"            
## [19] "id"

5.1 Pooled domain effects

  • M1 models domain effects
  • M2 models the global effect
randomEffect <- list(~ 1 | id, ~ 1 | author)
M1 <- rma.mv(yi ~ domain - 1 + ageCentered, vi, data=D, random=randomEffect, slab=slab)
M2 <- rma.mv(yi ~ ageCentered, vi, data=D, random=randomEffect)
betasM1 <- data.frame(M1[c("b", "se", "zval", "pval", "ci.lb", "ci.ub")])
betasM2 <- data.frame(M2[c("b", "se", "zval", "pval", "ci.lb", "ci.ub")])
j <- grep("domain", rownames(M1$b))
summary <- rbind(data.frame(studies = D[, .(studies = uniqueN(author)), domain][, studies],
                            tests = D[, .N, domain][, N],
                            betasM1[j, ]),
                 data.frame(studies = D[, .(studies = uniqueN(author))][, studies],
                            tests = D[, .N],
                            betasM2[1, ]))
rownames(summary) <- gsub("domain", "", rownames(summary))
rownames(summary) <- gsub("intrcpt", "**GLOBAL**", rownames(summary))
print(xtable(summary,
             caption="Pooled domain and global effect sizes",
             digits=c(0, rep(0, 2), rep(3, 3), 4, rep(3, 2))),
      type="html",
      caption.placement="top")
Pooled domain and global effect sizes
studies tests b se zval pval ci.lb ci.ub
Attn/Wkg Mem/Concen 9 49 0.027 0.083 0.325 0.7449 -0.136 0.190
Exec Fxn 6 14 0.115 0.141 0.817 0.4137 -0.161 0.392
Info Proc Speed 6 10 0.137 0.167 0.819 0.4126 -0.191 0.464
Motor Speed 4 10 -0.019 0.175 -0.109 0.9136 -0.362 0.324
Verb Ability/Lang 5 10 0.318 0.170 1.874 0.0609 -0.015 0.652
Verb Mem 6 17 0.656 0.134 4.906 0.0000 0.394 0.919
Vis Mem 4 11 0.644 0.168 3.830 0.0001 0.315 0.974
Visuospatial 4 4 0.346 0.272 1.272 0.2035 -0.187 0.878
GLOBAL 9 125 0.230 0.057 4.064 0.0000 0.119 0.341

The intraclass correlation within study is 5.69e-09.

summary(M1)
## 
## Multivariate Meta-Analysis Model (k = 125; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc  
## -125.4428   250.8855   272.8855   303.1750   275.4240  
## 
## Variance Components: 
## 
##             estim    sqrt  nlvls  fixed  factor
## sigma^2.1  0.2246  0.4739    125     no      id
## sigma^2.2  0.0000  0.0000      9     no  author
## 
## Test for Residual Heterogeneity: 
## QE(df = 116) = 462.7509, p-val < .0001
## 
## Test of Moderators (coefficient(s) 1,2,3,4,5,6,7,8,9): 
## QM(df = 9) = 44.1792, p-val < .0001
## 
## Model Results:
## 
##                            estimate      se     zval    pval    ci.lb
## domainAttn/Wkg Mem/Concen    0.0271  0.0832   0.3253  0.7449  -0.1360
## domainExec Fxn               0.1154  0.1412   0.8175  0.4137  -0.1613
## domainInfo Proc Speed        0.1368  0.1670   0.8193  0.4126  -0.1905
## domainMotor Speed           -0.0190  0.1750  -0.1085  0.9136  -0.3621
## domainVerb Ability/Lang      0.3185  0.1699   1.8742  0.0609  -0.0146
## domainVerb Mem               0.6565  0.1338   4.9064  <.0001   0.3942
## domainVis Mem                0.6443  0.1682   3.8304  0.0001   0.3146
## domainVisuospatial           0.3455  0.2717   1.2717  0.2035  -0.1870
## ageCentered                 -0.0096  0.0099  -0.9708  0.3316  -0.0289
##                             ci.ub     
## domainAttn/Wkg Mem/Concen  0.1902     
## domainExec Fxn             0.3922     
## domainInfo Proc Speed      0.4642     
## domainMotor Speed          0.3241     
## domainVerb Ability/Lang    0.6515    .
## domainVerb Mem             0.9187  ***
## domainVis Mem              0.9739  ***
## domainVisuospatial         0.8781     
## ageCentered                0.0097     
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(M2)
## 
## Multivariate Meta-Analysis Model (k = 125; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc  
## -140.2534   280.5068   288.5068   299.7555   288.8458  
## 
## Variance Components: 
## 
##             estim    sqrt  nlvls  fixed  factor
## sigma^2.1  0.2669  0.5166    125     no      id
## sigma^2.2  0.0000  0.0000      9     no  author
## 
## Test for Residual Heterogeneity: 
## QE(df = 123) = 532.5717, p-val < .0001
## 
## Test of Moderators (coefficient(s) 2): 
## QM(df = 1) = 2.2423, p-val = 0.1343
## 
## Model Results:
## 
##              estimate      se     zval    pval    ci.lb   ci.ub     
## intrcpt        0.2303  0.0567   4.0637  <.0001   0.1192  0.3413  ***
## ageCentered   -0.0154  0.0103  -1.4974  0.1343  -0.0356  0.0048     
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Save working data tables to file.

metadata <- makeMetadata(D)
f <- sprintf("%s/%s", pathOut, "metaAnalysisCognitiveImpairment.RData")
save(D, metadata, M1, M2, summary, file=f)
message(sprintf("%s saved on: %s\nFile size: %s KB", 
                f,
                file.mtime(f),
                file.size(f) / 1e3))
## Output/metaAnalysisCognitiveImpairment.RData saved on: 2015-12-18 10:24:28
## File size: 62.499 KB
f <- sprintf("%s/%s", pathOut, "metaAnalysisCognitiveImpairment-Data.csv")
write.csv(D, file=f, row.names=FALSE)
f <- sprintf("%s/%s", pathOut, "metaAnalysisCognitiveImpairment-summary.csv")
write.csv(summary, file=f, row.names=FALSE)

5.2 Plot of effect sizes

## png 
##   2

Full resolution file is here.

5.3 Diagnostic plots

Check the profile likelihoods of the variance and correlation components.

## Profiling sigma2 = 1 
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |===                                                              |   5%
  |                                                                       
  |======                                                           |  10%
  |                                                                       
  |==========                                                       |  15%
  |                                                                       
  |=============                                                    |  20%
  |                                                                       
  |================                                                 |  25%
  |                                                                       
  |====================                                             |  30%
  |                                                                       
  |=======================                                          |  35%
  |                                                                       
  |==========================                                       |  40%
  |                                                                       
  |=============================                                    |  45%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |====================================                             |  55%
  |                                                                       
  |=======================================                          |  60%
  |                                                                       
  |==========================================                       |  65%
  |                                                                       
  |==============================================                   |  70%
  |                                                                       
  |=================================================                |  75%
  |                                                                       
  |====================================================             |  80%
  |                                                                       
  |=======================================================          |  85%
  |                                                                       
  |==========================================================       |  90%
  |                                                                       
  |==============================================================   |  95%
  |                                                                       
  |=================================================================| 100%
## Profiling sigma2 = 2 
## 
  |                                                                       
  |                                                                 |   0%
  |                                                                       
  |===                                                              |   5%
  |                                                                       
  |======                                                           |  10%
  |                                                                       
  |==========                                                       |  15%
  |                                                                       
  |=============                                                    |  20%
  |                                                                       
  |================                                                 |  25%
  |                                                                       
  |====================                                             |  30%
  |                                                                       
  |=======================                                          |  35%
  |                                                                       
  |==========================                                       |  40%
  |                                                                       
  |=============================                                    |  45%
  |                                                                       
  |================================                                 |  50%
  |                                                                       
  |====================================                             |  55%
  |                                                                       
  |=======================================                          |  60%
  |                                                                       
  |==========================================                       |  65%
  |                                                                       
  |==============================================                   |  70%
  |                                                                       
  |=================================================                |  75%
  |                                                                       
  |====================================================             |  80%
  |                                                                       
  |=======================================================          |  85%
  |                                                                       
  |==========================================================       |  90%
  |                                                                       
  |==============================================================   |  95%
  |                                                                       
  |=================================================================| 100%

Funnel plot to check for publication bias. See BMJ 2011;342:d4002 for a guide to interpret funnel plots.

## png 
##   2

Publication bias does not appear to be a great concern.

6 Epilogue

## Sourcing https://gist.githubusercontent.com/benjamin-chan/80149dd4cdb16b2760ec/raw/a1fafde5c5086024dd01d410cc2f72fb82e93f26/sessionInfo.R
## SHA-1 hash of file is 41209357693515acefb05d4b209340e744a1cbe4
## $timeStart
## [1] "2015-12-18 10:24:21"
## 
## $timeEnd
## [1] "2015-12-18 10:24:49 PST"
## 
## $timeElapsed
## [1] "27.55376 secs"
## 
## $Sys.info
##                      sysname                      release 
##                    "Windows"                      "7 x64" 
##                      version                     nodename 
## "build 7601, Service Pack 1"                    "GHBA299" 
##                      machine                        login 
##                     "x86-64"                      "chanb" 
##                         user               effective_user 
##                      "chanb"                      "chanb" 
## 
## $sessionInfo
## R version 3.2.2 (2015-08-14)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 7 x64 (build 7601) Service Pack 1
## 
## locale:
## [1] LC_COLLATE=English_United States.1252 
## [2] LC_CTYPE=English_United States.1252   
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.1252    
## 
## attached base packages:
## [1] tools     stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] extrafont_0.17      DiagrammeR_0.7      metafor_1.9-8      
##  [4] Matrix_1.2-2        xtable_1.7-4        haven_0.2.0        
##  [7] googlesheets_0.1.0  openxlsx_3.0.0      devtools_1.8.0     
## [10] data.table_1.9.6    RevoUtilsMath_3.2.2
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.1      cellranger_1.0.0 formatR_1.2      git2r_0.11.0    
##  [5] digest_0.6.8     jsonlite_0.9.16  memoise_0.2.1    evaluate_0.7.2  
##  [9] lattice_0.20-33  DBI_0.3.1        rstudioapi_0.3.1 curl_0.9.3      
## [13] yaml_2.1.13      parallel_3.2.2   Rttf2pt1_1.3.3   dplyr_0.4.3     
## [17] httr_1.0.0       stringr_1.0.0    xml2_0.1.2       knitr_1.11      
## [21] htmlwidgets_0.5  rversions_1.0.2  grid_3.2.2       R6_2.1.1        
## [25] rmarkdown_0.7    extrafontdb_1.0  magrittr_1.5     htmltools_0.2.6 
## [29] assertthat_0.1   stringi_0.5-5    chron_2.3-47